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

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

_dos_findfirst, dos_findnext

unsigned _dos_findfirst(const char *fname, int attr, struct find_t*ptr)

unsigned _dos_findnext( struct find_t *ptr)

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

Эти функции не определены стандартом ANSI С.

Функция _dos_findfirst() ищет первое имя, соответствующее образцу, на который указывает fname. Имя файла может включать как диск, так и путь. Кроме того, имя файла может включать в себя шаблоны подстановки * и ?. В случае нахождения соответствующего файла структура, на которую указывает ptr, заполняется информацией об этом файле.

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

struct find_t {
char reserved[21]; /* используется DOS */
char attrib; /* атрибуты файла */
unsigned wr_time; /* время, когда файл перезаписывался в последний раз */
unsigned wr_date; /* дата, когда файл перезаписывался в последний раз */
long size; /* размер в байтах */
char name [13]; /* имя файла */
};

Параметр attrib определяет, какой тип файлов будет найден функцией _dos_findfirst(). Пара­метр attrib может быть получен из одного или нескольких макросов, определенных в файле dos.h:

МакросЗначение
_A_NORMALНормальный файл
_A_RDONLYФайл только для чтения
_A_HIDDENСкрытый файл
_A_SYSTEMСистемный файл
_A_VOLIDМетка тома
_A_SUBDIRПодкаталог
_A_ARCHАрхивный файл

Функция _dos_findnext() продолжает поиск, начатый функцией _dos_findfirst(). Буфер, на ко­торый указывает параметр ptr, должен быть тем же самым, который использовался при вызове функции _dos_findfirst().

Обе функции _dos_findfirst() и _dos_findnext() при успешном вызове возвращают 0. При неуда­че или если найден более чем один файл, возвращается ненулевое значение. При возникновении ошибки переменная errno устанавливается в ENOENT (файл не найден).

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