最終,我希望瀏覽文件夾的文件和子目錄,並將所有文件寫入我找到的具有特定擴展名(.wav)的文件。循環時我該如何判斷我所在的項目是否是一個目錄?如何在Windows上遞歸遍歷C中的目錄
回答
執行opendir和readdir的(在UNIX上),這裏有一個例子:
http://opengroup.org/onlinepubs/007908775/xsh/readdir.html
或用FindFirstFile在Windows
,你也可以使用殼很容易:
find . -name "*.wav"
or
ls **/*.wav (in zsh and newer bashes)
哎呀,忘了說我也是這樣做的windoze。 – pmilb 2010-01-10 22:36:45
基礎的在您提及.wav
時,我會猜測您正在編寫Windows代碼(這似乎是*.wav
文件是最常見的)。在這種情況下,您使用FindFirstFile
和FindNextFile
來遍歷目錄。這些使用WIN32_FIND_DATA
結構,該結構的成員dwFileAttributes
包含標識文件屬性的標誌。如果dwAttributes & FILE_ATTRIBUTE_DIRECTORY
不爲零,則表示目錄的名稱。
這裏是你如何做到這一點(這是所有從內存中,因此有可能是錯誤的):
void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
{
TCHAR szFullPattern[MAX_PATH];
WIN32_FIND_DATA FindFileData;
HANDLE hFindFile;
// first we are going to process any subdirectories
PathCombine(szFullPattern, lpFolder, _T("*"));
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// found a subdirectory; recurse into it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
FindFilesRecursively(szFullPattern, lpFilePattern);
}
} while(FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
// Now we are going to look for the matching files
PathCombine(szFullPattern, lpFolder, lpFilePattern);
hFindFile = FindFirstFile(szFullPattern, &FindFileData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
do
{
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
// found a file; do something with it
PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
_tprintf_s(_T("%s\n"), szFullPattern);
}
} while(FindNextFile(hFindFile, &FindFileData));
FindClose(hFindFile);
}
}
所以,你可以調用這個像
FindFilesRecursively(_T("C:\\WINDOWS"), _T("*.wav"));
找到所有的* .wav C:\ WINDOWS及其子目錄中的文件。從技術上講,你不必做兩次FindFirstFile()調用,但是我發現Microsoft提供的模式匹配函數(即PathMatchFileSpec或其他)不如FindFirstFile()。雖然對於「* .wav」,它可能會很好。
非常有幫助。 無論如何,我總是添加「。」,因此堆棧溢出。到路徑並返回到相同的路徑=無限循環。
添加此解決它:
// found a subdirectory; recurse into it PathCombine(szFullPattern, lpFolder, FindFileData.cFileName); FindFilesRecursively(szFullPattern, lpPattern); if (FindFileData.cFileName[0] == '.') continue;
這將排除以句點開頭的* all *目錄(包括來自* nix系統的隱藏目錄)。 – Synetech 2015-07-18 18:43:14
- 1. 遞歸目錄遍歷
- 2. perl中的遞歸目錄遍歷
- 3. 確定遞歸遍歷目錄結構
- 4. python目錄遞歸遍歷程序
- 5. 如何遞歸遍歷並記錄C#中的HttpRequestMessage的屬性?
- 6. 在c中無遞歸的預遍歷遍歷
- 7. 如何遞歸遍歷XPath?
- 8. 目錄遍歷c
- 9. 樹遍歷中的遞歸
- 10. 如何遞歸遍歷目錄樹並僅查找文件?
- 11. 如何遞歸遍歷所有子目錄並讀取文件?
- 12. 遞歸遍歷HashMap?
- 13. 樹遍歷遞歸
- 14. 遞歸字遍歷
- 15. 使用os.walk()以遞歸方式遍歷Python中的目錄
- 16. 目錄遞歸遍歷不超過Matlab中的2個級別
- 17. 非法字符在遞歸目錄遍歷
- 18. 遞歸遍歷目錄及其子目錄中的所有文件Qt
- 19. 遞歸遍歷的Java
- 20. 樹的遍歷,遞歸
- 21. 如何遞歸遍歷Objective-C中的XML文件?
- 22. C中的遞歸目錄
- 23. 目錄遍歷問題c#
- 24. 遞歸遍歷C#中的一棵樹從上往下排
- 25. 循環遍歷遞歸列表C
- 26. 如何實現非遞歸inOrder遍歷
- 27. 來自遞歸目錄遍歷的堆棧溢出錯誤
- 28. C++遍歷目錄中的文件
- 29. c中的迭代目錄遍歷
- 30. 在Python中遞歸地遍歷字典?
遍歷目錄是依賴於操作系統的,所以你可能需要告訴我們您正在使用什麼操作系統。有一些操作系統無關的庫。如果您正在使用其中之一,我們需要知道哪個可以給出一個好的答案。 – 2010-01-10 22:34:08
這是一個UNIX-y平臺(Mac等)或Windows,還是其他的東西?許多平臺都支持POSIX標準(http://robot.mbhs.edu/wordpress/2009/how-to-get-a-directory-listing-in-c-posix/),但通常也會有它們的自己的方式做到這一點,特別是Windows(FindFirstFile/FindNextFile) – 2010-01-10 22:34:17
我還沒有得到這個工作,我想要的。 FindFirstFile正在輸出我所在目錄的名稱,而不是目錄中的第一個文件,如果我離開尾部/。如果我確實把尾部/它給了我一個奇怪的文件名(aaaaa-LIBVC ...)。此外,這兩次FindNextFile不會返回任何值 – pmilb 2010-01-11 01:45:26