_find、_wfind 函式
這些函式搜尋和結束搜尋指定的檔案名稱:
備註
_findfirst 函式會提供與 filespec 引數所指定的檔案名稱相符的第一個執行個體的相關資訊。 您可以在 filespec 所使用的主機作業系統支援萬用字元的任何組合。
在 _finddata_t 結構的函式會傳回檔案資訊,在 IO.h 定義。 在系列的各種函式會使用 _finddata_t 結構中的許多變化。 基礎 _finddata_t 結構包含下列元素:
unsigned attrib
檔案屬性。time_t time_create
檔案建立的時間 (FAT 檔案系統的 ─1L)。 這個時間以 UTC 格式儲存。 要轉換為本地時間,請使用 localtime_s。time_t time_access
上次存取檔案的時間 (FAT 檔案系統的 ─1L)。 這個時間以 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) 條件尋找作業。 這些屬性在 _finddata_t 結構的 attrib 欄位傳回,而且可以是下列其中一個值 (定義於 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 的巨集 (如果定義 _USE_32BIT_TIME_T 則為 _finddata32_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 );
}
}