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

看板C_and_CPP作者 (卡卡獸)時間11年前 (2013/12/18 16:15), 編輯推噓1(1010)
留言11則, 4人參與, 最新討論串1/1
開發平台(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

12/19 01:01, , 1F
請 dir /b 代勞用 pipe 去接清單 XD
12/19 01:01, 1F

12/19 04:01, , 2F
同樓上或是用 Boost.Filesystem
12/19 04:01, 2F

12/19 16:52, , 3F
這問題很常見。列出所有檔案再套用你的filter。
12/19 16:52, 3F

12/19 22:13, , 4F
@Bencrie : _popen ? 這似乎只能在 console run
12/19 22:13, 4F

12/19 22:13, , 5F
@freaky , 指的是在找 *.* 時,再根據 filter 做字串分析?
12/19 22:13, 5F

12/20 00:18, , 6F
"d:\\data\\*",找到目錄遞迴,找到檔案比對".h"".cpp"
12/20 00:18, 6F

12/20 00:19, , 7F
嗯,所以最後還是要做字串分析比對.. 這篇問題便是假設
12/20 00:19, 7F

12/20 00:20, , 8F
filter 設 "c???ab.h *abc.cpp *.?ac" 這種 filter時候..
12/20 00:20, 8F

12/20 00:21, , 9F
看來要看還是要弄個 Parse .. 謝謝 freaky
12/20 00:21, 9F

12/20 00:22, , 10F
不管你用那種API做法都是所有檔案找一次再比
12/20 00:22, 10F

12/20 00:23, , 11F
了解,謝謝 !!
12/20 00:23, 11F
文章代碼(AID): #1IiSeYoJ (C_and_CPP)