1. 程式人生 > >C/C++:遍歷子目錄,列舉檔案,FindFirstFile + FindNextFile

C/C++:遍歷子目錄,列舉檔案,FindFirstFile + FindNextFile

  平時寫程式時經常會用到的遍歷子目錄列舉檔案的功能,用 Windows API 函式 FindFirstFile() 和 FindNextFile() 直接實現起來會相當繁瑣,有許多細節需要注意和記憶,要在短時間內寫出可以正常工作的、沒有BUG的、能夠遞迴遍歷多層子目錄並列舉其中所有檔案的程式程式碼,不是一件輕鬆的事情。以下這個 doFileEnumeration() 函式,是我(liigo)在 Windows API 函式 FindFirstFile() 和 FindNextFile() 的基礎上封裝實現的,可以輕鬆自如的處理遍歷子目錄列舉檔案的任務,使用起來非常簡單,具有較高的實用價值。這個函式其實是我之前釋出的易語言“

輔助除錯支援庫”(已開源至googlecode)中“列舉檔案”“列舉子目錄”這兩條命令的底層實現函式。

  doFileEnumeration() 函式功能是實現列舉檔案和列舉子目錄,支援遞迴處理多層子目錄巢狀的情況。它有五個引數:第一個引數lpPath指定欲遍歷的路徑(資料夾);第二個引數bRecursion指定是否遞迴處理子目錄;第三個引數bEnumFiles指定是列舉檔案還是列舉子目錄;第四個引數pFunc為使用者回撥函式,列舉過程中每遇到一個檔案或子目錄,都會呼叫它,並傳入這個檔案或子目錄的完整路徑;第五個引數pUserData為使用者任意指定的資料,它也將被傳入使用者回撥函式。使用者回撥函式(EnumerateFunc)有兩個引數,一個是檔案或子目錄的完整路徑(lpFileOrPath),一個是使用者自定義資料(pUserData),它被自動呼叫,使用者需在此函式中編碼處理程式碼。

  這個函式經過我(liigo)的仔細設計,介面很簡潔,使用也方便。有意去除了 FindFirstFile(Ex)/FindNextFile 中過濾檔名稱或屬性的部分功能,也是出於簡化介面的考慮,——在使用者回撥函式中處理這些事情也是很容易的(在易語言中更容易)。在實現的細節上,重點是對子目錄和遞迴的處理。以下是完整的原始碼:

以下是應用示例程式碼: