Fw: [問題] 資料夾窮舉檔案 Filter

作者: EdisonX (卡卡獸)   2013-12-19 00:20:15
※ [本文轉錄自 C_and_CPP 看板 #1IiSeYoJ ]
作者: EdisonX (卡卡獸) 看板: C_and_CPP
標題: [問題] 資料夾窮舉檔案 Filter
時間: Thu Dec 19 00:15:26 2013
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
測過 VC6.0 / vc2010
問題(Question):
目前是用 FindFirstFile / FindNextFile 這組 API ,想完成 cmd.exe 以下這件事
cd /d D:\Data
dir *.h *.cpp /s /b
但目前測下來似乎沒那麼容易完成,所以想說先階段式完成,
關鍵目前看來是 FindFirstFile 第一個參數問題。
HANDLE hFile;
WIN32_FIND_DATA tmData;
///< 這種敘述最後什麼都找不到
hFile = FindFirstFile( "D:\\Data\\*.h *.cpp", &tmData);
///< 這種敘述也找不到
chdir("D:\\Data");
hFile = FindFirst("*.h *.cpp", &tmData);
目前我是分兩次去找,一次是去找 D:\Data\*.h,另一次是去找 D:\Data\*.cpp,
之所以不用 FindFirst("*.*") ,掃出來結果再去比對副檔名,原因有二:
(1) 遇到 c*.cpp 這種東西我還要自己去處理,懶了。
(2) *.* 的數量可能比 *.cpp *.h 多很多,所以又多了一堆不必要的窮舉。
不知道這情況是不是以這方式為最佳?
最麻煩的是,上述這方式能找到的只能是單層,如果要達到再進入資料夾底下
做所有搜尋的話,我的做法是
(A) FindFirst("D:\\Data\\*.*", &tmData);
FindNext 做深層遞迴掃描。
(B) 看 tmData 屬性,如果是資料夾的話放入 queue
(C) 深層掃完後,queue 會得到所有資料夾,再對所有資料夾
做 FindFirst("*.c", &tmData), FindFirst("*.h", &tmData);
整個流程下來感覺多做了很多不必要的事,幾個 filter 就掃了幾次。
上述步驟 (A) , 曾想過是否有 APIs 只列舉路徑下的資料夾就行,
這樣應就可以省很多工,但目前我也還沒找到這支 API。
綜合以上說明,問題整理如下
(i) 單層資料夾窮舉 *.h *.cpp
(ii) 資料夾深層遞迴窮舉 *.h *.cpp
目前大多是怎做的?還是目前也是 open problem ?
謝謝各位不吝指教,小弟感激不盡。

Links booklink

Contact Us: admin [ a t ] ucptt.com