FindFirstFileExA 函式 (fileapi.h)

使用符合指定之檔案或屬性的名稱和屬性,搜尋目錄。

如需此函式的最基本版本,請參閱 FindFirstFile

若要以交易作業的形式執行此作業,請使用 FindFirstFileTransacted 函式

語法

HANDLE FindFirstFileExA(
  [in]  LPCSTR             lpFileName,
  [in]  FINDEX_INFO_LEVELS fInfoLevelId,
  [out] LPVOID             lpFindFileData,
  [in]  FINDEX_SEARCH_OPS  fSearchOp,
        LPVOID             lpSearchFilter,
  [in]  DWORD              dwAdditionalFlags
);

參數

[in] lpFileName

目錄或路徑,以及檔案名。 檔案名可以包含萬用字元,例如星號 (*) 或問號 (?) 。

此參數不應為 Null、不正確字串 (例如空字串或遺漏終止 Null 字元的字串) ,或結尾為尾端反斜線 (\) 。

如果字串以萬用字元、句號或目錄名稱結尾,則使用者必須能夠存取路徑上的根目錄和所有子目錄。

根據預設,名稱限制為MAX_PATH個字元。 若要將此限制延伸至 32,767 寬字元,請在路徑前面加上 「\\?\」。 如需詳細資訊,請參閱命名檔案、路徑與命名空間

提示

從 Windows 10 版本 1607 開始,您可以選擇移除MAX_PATH限制,而不需在前面加上 「\\?\」。 如需詳細資訊,請參閱 命名檔案、路徑和命名空間 的一節。

[in] fInfoLevelId

傳回資料的資訊層級。

此參數是其中一個 FINDEX_INFO_LEVELS 列舉值。

[out] lpFindFileData

接收檔案資料的緩衝區指標。

指標類型取決於 fInfoLevelId 參數中指定的資訊層級。

[in] fSearchOp

要執行的篩選類型,與萬用字元比對不同。

此參數是其中一個 FINDEX_SEARCH_OPS 列舉值。

lpSearchFilter

如果指定的 fSearchOp 需要結構化搜尋資訊,則為搜尋準則的指標。

目前,不支援的 fSearchOp 值都不需要延伸搜尋資訊。 因此,這個指標必須是 Null

[in] dwAdditionalFlags

指定控制搜尋的其他旗標。

意義
FIND_FIRST_EX_CASE_SENSITIVE
1
搜尋會區分大小寫。
FIND_FIRST_EX_LARGE_FETCH
2
針對目錄查詢使用較大的緩衝區,這會增加尋找作業的效能。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows Server 2008 R2 和 Windows 7 之前,不支援此值。

FIND_FIRST_EX_ON_DISK_ENTRIES_ONLY
4
將結果限制為實際位於磁片上的檔案。 只有在檔案虛擬化篩選存在時,此旗標才相關。

傳回值

如果函式成功,則傳回值是搜尋控制碼,用於後續呼叫 FindNextFileFindClose而 lpFindFileData 參數包含找到的第一個檔案或目錄的相關資訊。

如果函式失敗或無法從 lpFileName 參數中的搜尋字串找出檔案,傳回值 會INVALID_HANDLE_VALUElpFindFileData 的內容不確定。 若要取得擴充的錯誤資訊,請呼叫 GetLastError 函式。

備註

FindFirstFileEx函式會開啟搜尋控制碼,並傳回檔案系統找到之名稱符合指定模式的第一個檔案相關資訊。 當指定相同的檔案名字串模式時,這可能不是出現在目錄清單應用程式中的第一個檔案或目錄 (,例如 dir 命令) 。 這是因為 FindFirstFileEx 不會排序搜尋結果。 如需詳細資訊,請參閱 FindNextFile

下列清單會識別一些其他搜尋特性:

  • 搜尋會嚴格地在檔案名上執行,而不是在日期或檔案類型等任何屬性上執行。
  • 搜尋包含長檔名和簡短檔案名。
  • 嘗試以尾端反斜線開啟搜尋一律會失敗。
  • 傳遞lpFileName參數的無效字串、Null或空字串不是這個函式的有效用法。 在此情況下的結果未定義。
注意 在極少數的情況下或大量載入的系統上,在呼叫此函式時,NTFS 檔案系統上的檔案屬性資訊可能不是最新的。 若要確保取得目前的 NTFS 檔案系統檔案屬性,請呼叫 GetFileInformationByHandle 函式。
 
如果基礎檔案系統不支援指定的篩選類型,除了目錄篩選之外, FindFirstFileEx 會失敗,並出現錯誤 ERROR_NOT_SUPPORTED。 應用程式必須使用 FINDEX_SEARCH_OPS 類型 FileExSearchNameMatch 並執行自己的篩選。

建立搜尋控制碼之後,請在 FindNextFile 函式中使用它來搜尋符合相同模式的其他檔案,以及正在執行的相同篩選。 當不需要搜尋控制碼時,應該使用 FindClose 函式來關閉它。

如先前所述,您無法在FindFirstFileExlpFileName輸入字串中使用尾端反斜線 (\) ,因此搜尋根目錄可能不明顯。 如果您想要查看檔案或取得根目錄的屬性,則會套用下列選項:

  • 若要檢查根目錄中的檔案,您可以使用 「C:\*」,並使用 FindNextFile逐步執行目錄。
  • 若要取得根目錄的屬性,請使用 GetFileAttributes 函式
注意 在字串 「\\?\」 前面不允許存取根目錄。
 

在網路共用上,您可以使用下列格式的 lpFileName :「\\server\service\*」。 不過,您無法使用指向共用本身的 lpFileName ;例如,「\\server\service」 無效。

若要檢查不是根目錄的目錄,請使用該目錄的路徑,而不需尾端反斜線。 例如,「C:\Windows」 的引數會傳回目錄 「C:\Windows」 的相關資訊,而不是 「C:\Windows」 中的目錄或檔案。 若要檢查 「C:\Windows」 中的檔案和目錄,請使用 「C:\Windows\*」 的 lpFileName

下列呼叫:

FindFirstFileEx( lpFileName, 
                 FindExInfoStandard, 
                 lpFindData, 
                 FindExSearchNameMatch, 
                 NULL, 
                 0 );

相當於下列呼叫:

FindFirstFile( lpFileName, lpFindData );

請注意,某些其他執行緒或進程可以在查詢結果和處理資訊的時間之間,建立或刪除具有此名稱的檔案。 如果這是應用程式的潛在考慮,其中一個可能的解決方案是使用 CreateFile 函式搭配 CREATE_NEW (,如果檔案存在) 或 OPEN_EXISTING (檔案不存在) ,就會失敗。

如果您要撰寫 32 位應用程式來列出目錄中的所有檔案,而且應用程式可能會在 64 位電腦上執行,則您應該呼叫 Wow64DisableWow64FsRedirection ,再呼叫 FindFirstFileEx 並呼叫 Wow64RevertWow64FsRedirection ,再呼叫 FindNextFile。 如需詳細資訊,請參閱 檔案系統重新導向器

如果路徑指向符號連結, 則WIN32_FIND_DATA 緩衝區包含符號連結的相關資訊,而不是目標。

在Windows 8和Windows Server 2012中,下列技術支援此函式。

技術 支援
伺服器訊息區 (SMB) 3.0 通訊協定 Yes
SMB 3.0 透明容錯移轉 (TFO) Yes
具有向外延展檔案共用的 SMB 3.0 (SO) Yes
叢集共用磁片區檔案系統 (CsvFS) Yes
彈性檔案系統 (ReFS)
 

範例

下列程式碼顯示 FindFirstFileEx的最少用法。 此程式相當於 FindFirstFile 主題中的範例。

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

void _tmain(int argc, TCHAR *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind;

   if( argc != 2 )
   {
      _tprintf(TEXT("Usage: %s [target_file]\n"), argv[0]);
      return;
   }

   _tprintf (TEXT("Target file is %s\n"), argv[1]);
   hFind = FindFirstFileEx(argv[1], FindExInfoStandard, &FindFileData,
             FindExSearchNameMatch, NULL, 0);
   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("FindFirstFileEx failed (%d)\n", GetLastError());
      return;
   } 
   else 
   {
      _tprintf (TEXT("The first file found is %s\n"), 
                FindFileData.cFileName);
      FindClose(hFind);
   }
}

注意

fileapi.h 標頭會將 FindFirstFileEx 定義為別名,根據 UNICODE 預處理器常數的定義,自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程式碼,可能會導致編譯或執行時間錯誤不符。 如需詳細資訊,請參閱 函式原型的慣例

規格需求

   
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 fileapi.h (包含 Windows.h)
程式庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

FINDEX_INFO_LEVELS

FINDEX_SEARCH_OPS

檔案管理功能

FindClose

FindFirstFile

FindFirstFileTransacted

FindNextFile

GetFileAttributes

命名檔案

符號連結

使用 Windows 標頭

WIN32_FIND_DATA