Программирование на C и C++

Онлайн справочник программиста на C и C++

findfirst, findnext

int findfirst(const char *fname, struct ffblk *ptr, int attrib)

int findnext( struct ffblk *ptr)

Прототип: 
Описание: 

Необходимо вклю­чить фaйл dos.h, который содержит макросы, используемые в качестве значения параметра attrib. Эти функции не определены стандартом ANSI С. Функция findfirst() ищет первое имя файла, соответствующее образцу поиска, на который ука­зывает параметр fname. Имя файла может включать в себя диск и путь. Также имя файла может включать в себя шаблоны поиска * и ?. При нахождении подходящего файла структура, на кото­рую указывает ptr, заполняется информацией об этом файле.

Структура ffblk определена для DOS следующим образом:

struct ffblk {
char ff_reserved[21]; /*зарезервировано */
char ff_attrib; /*атрибуты файла */
unsigned ff_ftime; /*время создания */
unsigned ff_fdate; /*дата создания */
long ff_fsize; /*размер в байтах */
char ff_name[13]; /*имя файла */
};

Структура ffblk определена для Windows следующим образом:

struct ffblk {
long ff_reserved; /* зарезервировано */
long ff_fsize; /* размер в байтах */
unsigned long ff_attrib; /* атрибуты файла */
unsigned short ff_ftime; /* время создания */
unsigned short ff_fdate; /* дата создания */
char ff_name[256]; /* имя файла */
};

Параметр attrib определяет тип файлов, которые необходимо найти с помощью функции findfirst(). Если attrib имеет значение 0, то допустимыми являются все файлы, подходящие под шаблон поиска. Для того, чтобы обеспечить более селективный поиск, параметр attrib может при­нимать одно из значений, определяемых следующими макросами:

МакросЗначение
FA_RDONLYФайл только для чтения
FA_HIDDENСкрытый файл
FA_SYSTEMСистемный файл
FA_LABELМетка тома
FA_DIRECПодкаталог
FA_ARCHАрхивный файл

Функция findnext() продолжает поиск, начатый функцией findfirst().

Обе функции findfirst() и findnext() в случае успеха возвращают 0. В случае неудачи возвраща­ется — 1, а переменная errno устанавливается равной ENOENT (имя файла не найдено). Перемен­ная _doserrno устанавливается равной либо ENMFILE (нет больше файлов в каталоге), либо ENOENT.

Пример: 
Следующая программа выводит все файлы с расширением .С текущего рабочего каталога, а также их размеры:
#include <stdio.h>
#include <dos.h>
#include <dir.h>
int main(void)
{
struct ffblk f;
register int done;
done = findfirst ("*.с", &f, 0);
while(!done) {
printf ("%s %ld\n", f.ff_name, f.ff_fsize);
done = findnext(&f);
}
return 0;
}