- •Лабораторная работа №5
- •Теоретические сведения
- •Функция поиска файла или каталога на диске findfirst
- •Функция продолжения поиска файла findnext
- •Пример использования функций findfirst и findnext.
- •Строка аргументов
- •Примеры программирования
- •Текст программы.
- •Пояснения к программе.
- •Текст программы.
- •Пояснения к программе.
- •Контрольные вопросы.
- •Лабораторное задание
- •Порядок выполнения лабораторной работы
- •Основные функции работы с каталогами файловой системы
- •Варианты заданий.
Функция продолжения поиска файла findnext
Прототип функции:
int findnext ( struct ffblk *buffer );
Функция findnext используется для поиска следующего файла, имя которого подходит под регулярное выражение, заданное как аргумент для последнего вызова функции findfirst. Структура, заполняемая при вызове функции, содержит информацию, необходимую для продолжения поиска. На каждый последующий вызов функции findnext будет возвращаться новое имя файла до тех пор, пока не возникнет такая ситуация, что не останется более ни одного файла, имя которого подходило бы под заданное регулярное выражение. Поиск происходит только в пределах каталога.
Функция возвращает значение 0 при успешном поиске и значение -1, если файл не найден.
Пример использования функций findfirst и findnext.
Выведем на экран все файлы с расширением cpp из текущего каталога.
#include <dir.h>
#include <dos.h>
#include <conio.h>
#include <stdio.h>
void main()
{
clrscr(); // очистка экрана
ffblk f; // структура ffblk
char *path=new char[20]; // регулярное выражение
strcpy(path,"*.cpp");
/* поиск первого файла с расширением cpp */
int a=findfirst(path,&f,FA_DIREC);
while(!a) // цикл пока файл не найден
{
puts(f.ffnane); // печать имени файла
a=findnext(&f); // продолжить поиск
}
} // конец функции main
Описание некоторых других функций, обеспечивающих работу с каталогами, приведено в приложении.
Строка аргументов
Как и любая другая функция, написанная на языке С++, функция main может иметь аргументы. Эти аргументы передаются функции main через командную строку. В этом случае функция main должна иметь вид :
void main ( int argc, char *argv[ ] )
Параметр argc определяет общее количество передаваемых аргументов.
Параметр argv представляет собой массив адресов, каждый элемент которого указывает на строковое представление соответствующего по порядку аргумента, передаваемого программе. Первый элемент массива argv (т.е. argv[0]) всегда содержит имя программы, по которому она была вызвана. Этот элемент всегда заполнен, поэтому значение argc всегда равно, по крайней, мере 1.
Задать значения аргументов командной строки можно либо из MS-DOS, например: D>prim.exe test.txt, где prim.exe имя файла исполняемой программы, а test.txt имя второго аргумента; либо из интегрированной среды Borland 3.1: пункт меню Run, подпункт Arguments.
Примеры программирования
Пример 1.
Вывести на экран информацию о файлах с расширением, указанным в строке аргументов, по мере создания файлов. Если расширение не указано, то выбрать расширение cpp .
Текст программы.
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <dir.h>
void main(int argc,char *argv[])
{ struct DIR{
char name [13]; // имя файла
long size; // размер
int data; // дата создания
int time; // время создания
};
struct list{
DIR inf; // информация о файле
list *next; // адрес следующей информации
};
/* описание переменных */
list *Dir=NULL,*pntr,*p,*min;
DIR dir;
ffblk ff;
char *path=new char[35];
/* формирование имени файла для поиска */
if(argc==1)strcpy(path,"*.cpp");
else {
strcpy(path,"*.");
strcat(path,argv[1]);
}
/* поиск файлов и заполнение одно-связанного списка
информацией о файлах */
int a= findfirst(path,&ff,FA_DIREC &&FA_ARCH);
while(!a)
{ pntr=new list;
if(Dir == NULL ) Dir=pntr;
else p->next=pntr;
strcpy(pntr->inf.name,ff.ff_name);
pntr->inf.size=ff.ff_fsize;
pntr->inf.data=ff.ff_fdate;
pntr->inf.time=ff.ff_ftime;
pntr->next=NULL;
p=pntr;
a=findnext(&ff);
}
/* сортировка одно-связанного списка по дате создания файлов */
p=Dir;
while (p!=NULL)
{ pntr=p;
min=p;
while(pntr!=NULL)
{ if(pntr->inf.data<min->inf.data)min=pntr;
pntr=pntr->next;
}
dir=min->inf;
min->inf=p->inf;
p->inf=dir;
p=p->next;
}
/* печать односвязанного списка с информацией о файлах */
clrscr();
printf(" имя файла размер дата\n\n");
while(Dir!=NULL)
{ printf(" %-15s %ld %d\n",Dir->inf.name,
Dir->inf.size,
(( Dir->inf.data&0177000)>>9)+1980);
p=Dir;
Dir=Dir->next;
delete p;
}
}