共用方式為


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_VALUE 傳回值,且 lpFindFileData 的內容不確定。 若要取得擴充的錯誤資訊,請呼叫 getLastError 函式

言論

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

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

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

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

如先前所述,您無法在 lpFileName 輸入字串中使用尾端反斜杠 (\), FindFirstFileEx,因此搜尋根目錄可能並不明顯。 如果您想要檢視檔案或取得根目錄的屬性,適用下列選項:

  • 若要檢查根目錄中的檔案,您可以使用 「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,並在最後一次呼叫 FindNextFile之後呼叫 Wow64RevertWow64FsRedirection 。 如需詳細資訊,請參閱 檔案系統重新導向器

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

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

科技 支援
伺服器消息塊 (SMB) 3.0 通訊協定 是的
SMB 3.0 透明故障轉移 (TFO) 是的
具有向外延展檔案共用的SMB 3.0(SO) 是的
叢集共用磁碟區檔案系統 (CsvFS) 是的
復原檔案系統 (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 標頭會根據 UNICODE 預處理器常數的定義,將 FindFirstFileEx 定義為自動選取此函式的 ANSI 或 Unicode 版本。 混合使用編碼中性別名與非編碼中性的程序代碼,可能會導致編譯或運行時間錯誤不符。 如需詳細資訊,請參閱函式原型的 慣例。

要求

要求 價值
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
支援的最低伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平臺 窗戶
標頭 fileapi.h (包括 Windows.h)
連結庫 Kernel32.lib
DLL Kernel32.dll

另請參閱

FINDEX_INFO_LEVELS

FINDEX_SEARCH_OPS

檔案管理功能

FindClose

FindFirstFile

FindFirstFileTransacted

FindNextFile

GetFileAttributes

命名檔案

符號連結

使用 Windows 標頭

WIN32_FIND_DATA