_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]
    匹配的文件或目录以Nul结尾的名称,无路径。

在不支持创建,文件最后访问时间的文件系统中,如 FAT 系统,所以 time_create 和 time_access 字段始终-1L。

_MAX_PATH 在 Stdlib.h 定义为 260 个字节。

无法指定目标特性 (如 _A_RDONLY) 来限定查找操作。 这些特性在 attrib 字段返回 _finddata_t 结构,并可具有下列值 (在 IO.h 定义)。 用户不应依赖于的这些特有的值可能为 attrib 字段。

  • _A_ARCH
    Archive. 设置什么时候文件被改变,并通过 BACKUP命令清理文件。 值:0x20。

  • _A_HIDDEN
    隐藏文件 通常不会看到与 DIR 命令,除非您使用 /AH 选项。 返回和普通文件盒包含这些特性的文件的信息。 值:0x02。

  • _A_NORMAL
    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版本。

结构

时间类型

类型文件大小

_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 是 unsigned long (32 位) typedef。

示例

// 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 );
   }
}
  

请参见

参考

系统调用