这些函数搜索并关闭指定的文件名。
备注
_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 );
}
}