Функции _find, _wfind
Эти функции осуществляют поиск и завершают его для указанных имен файлов:
Заметки
Функция _findfirst предоставляет сведения о первом экземпляре имени файла, соответствующим файлу, указанному в аргументе filespec. В filespec можно использовать любые комбинации подстановочных знаков, которые поддерживаются операционной системой.
Функции возвращают сведения о файле в структуре finddata_t, которая определена в IO.h. Различные функции в данном семействе используют множество вариантов в структуре _finddata_t. Базовая структура _finddata_t содержит следующие элементы:
unsigned attrib
Атрибут файла.time_t time_create
Время создания файла (-1L для файловых систем FAT). Это время хранится в формате UTC. Для преобразования в местное время используйте localtime_s.time_t time_access
Время последнего доступа к файлу (–1L для файловых систем FAT). Это время хранится в формате UTC. Для преобразования в местное время используйте localtime_s.time_t time_write
Время последней записи в файл. Это время хранится в формате UTC. Для преобразования в местное время используйте localtime_s._fsize_t size
Длина файла в байтах.char name [ _MAX_PATH]
Имя, завершающееся символом null, совпавшего файла или каталога, без пути.
В файловых системах, которые не поддерживают время создания и последнего обращения к файлу, например система FAT, time_create и поля time_access всегда равны -1L.
_MAX_PATH определён в Stdlib.h как 260 байт.
Нельзя задать атрибуты целевого объекта (например _A_RDONLY) для ограничения операции поиска. Эти атрибуты возвращаются в поле attrib структуры _finddata_t и могут иметь следующие значения (определенные в IO.h). Пользователи не должны считать эти значения единственно возможными для поля attrib.
_A_ARCH
Архив. Задается при изменении файла и очищается командой BACKUP. Значение: 0x20._A_HIDDEN
Скрытый файл. Обычно не вместе с командой DIR, если не используется параметр /AH. Возвращает сведения об обычных файлах и файлах, имеющих этот атрибут. Значение: 0x02._A_NORMAL
Обычный. Файл не имеет других атрибутов и может быть прочитан или в него может производится запись без ограничений. Значение: 0x00._A_RDONLY
Только для чтения. Файл невозможно открыть для записи, и файл с тем же именем создать невозможно. Значение: 0x01._A_SUBDIR
Подкаталог. Значение: 0x10._A_SYSTEM
Системный файл. Как правило, не вместе с командой DIR, если не используется параметр /A или /A:S. Значение: 0x04.
_findnext находит следующее имя, если таковые имеются, которое соответствует аргументу filespec, указанному в предыдущем вызове _findfirst. Аргумент fileinfo должен указывать на структуру, инициализированную предыдущим вызовом _findfirst. Если обнаружено соответствие, содержимое структуры fileinfo изменяется, как описано выше. В противном случае он остается неизменным. _findclose закрывает указанный дескриптор поиска и освобождает все связанные ресурсы как для _findfirst, так и для _findnext. Дескриптор, возвращенный ранее либо _findfirst, либо _findnext необходимо сначала передать _findclose, прежде чем операции изменения, например удаление, можно будет выполнить в каталогах, которые формирует пути, переданные им.
Можно вложить функции _find. Например, если вызов _findfirst или _findnext найдет файл, являющийся подкаталогом, то новый поиск можно начать другим вызовом _findfirst или _findnext.
_wfindfirst и _wfindnext версии для расширенных символов функций _findfirst и _findnext. Аргумент структуры версий для расширенных символов имеет тип данных _wfinddata_t, который определен в IO.h и в Wchar.h. Поля этого типа данных такие же, как типа данных _finddata_t, за исключением того, что в _wfinddata_t поле имени типа wchar_t, а не типа char. В противном случае _wfindfirst и _wfindnext ведут себя идентично _findfirst и _findnext.
_findfirst и _findnext используют 64-разрядный тип времени. Если необходимо использовать прежний 32-разрядный тип времени, можно указать _USE_32BIT_TIME_T. Версии этих функций, которые имеют суффикс 32 в своих именах, используют 32-разрядный тип времени, и те, что с суффиксом 64 используют 64-разрядный тип времени.
Функции _findfirst32i64, _findnext32i64, _wfindfirst32i64 и _wfindnext32i64 также ведут себя идентично версиям этих функций с 32-разрядным типом времени, за исключением того, что они используют и возвращают 64-разрядные длины файла. Функции _findfirst64i32, _findnext64i32, _wfindfirst64i32 и _wfindnext64i32используют 64-разрядный тип времени, но 32-разрядные длины файла. Эти функции используют соответствующие варианты типа _finddata_t, в которых поля имеют разные типы для времени и размера файла.
_finddata_t - фактически макрос, который является _finddata64i32_t (или _finddata32_t, если определен _USE_32BIT_TIME_T). В следующей таблице приведены сводные сведения об этих вариантах _finddata_t:
Структура |
Тип Time. |
Тип размера файла |
---|---|---|
_finddata_t, _wfinddata_t |
__time64_t |
_fsize_t |
_finddata32_t, _wfinddata32_t |
__time32_t |
_fsize_t |
__finddata64_t, __wfinddata64_t |
__time64_t |
__int64 |
_finddata32i64_t, _wfinddata32i64_t |
__time32_t |
__int64 |
_finddata64i32_t, _wfinddata64i32_t |
__time64_t |
_fsize_t |
_fsize_t - typedef для unsigned long (32 бита).
Пример
// crt_find.c
// This program uses the 32-bit _find functions to print
// a list of all files (and their attributes) with a .C extension
// in the current directory.
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <time.h>
int main( void )
{
struct _finddata_t c_file;
intptr_t hFile;
// Find first .c file in current directory
if( (hFile = _findfirst( "*.c", &c_file )) == -1L )
printf( "No *.c files in current directory!\n" );
else
{
printf( "Listing of .c files\n\n" );
printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );
printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );
do {
char buffer[30];
printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );
printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );
ctime_s( buffer, _countof(buffer), &c_file.time_write );
printf( " %-12s %.24s %9ld\n",
c_file.name, buffer, c_file.size );
} while( _findnext( hFile, &c_file ) == 0 );
_findclose( hFile );
}
}