Поделиться через


Функции _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 );
   }
}
  

См. также

Ссылки

Системные вызовы