看板 C_and_CPP 關於我們 聯絡資訊
開發平台(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 ? 謝謝各位不吝指教,小弟感激不盡。 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.74.188 EdisonX:轉錄至看板 Programming 12/19 00:20
Bencrie:請 dir /b 代勞用 pipe 去接清單 XD 12/19 01:01
loveme00835:同樓上或是用 Boost.Filesystem 12/19 04:01
freaky:這問題很常見。列出所有檔案再套用你的filter。 12/19 16:52
EdisonX:@Bencrie : _popen ? 這似乎只能在 console run 12/19 22:13
EdisonX:@freaky , 指的是在找 *.* 時,再根據 filter 做字串分析? 12/19 22:13
freaky:"d:\\data\\*",找到目錄遞迴,找到檔案比對".h"".cpp" 12/20 00:18
EdisonX:嗯,所以最後還是要做字串分析比對.. 這篇問題便是假設 12/20 00:19
EdisonX:filter 設 "c???ab.h *abc.cpp *.?ac" 這種 filter時候.. 12/20 00:20
EdisonX:看來要看還是要弄個 Parse .. 謝謝 freaky 12/20 00:21
freaky:不管你用那種API做法都是所有檔案找一次再比 12/20 00:22
EdisonX:了解,謝謝 !! 12/20 00:23