最终,我希望浏览文件夹的文件和子目录,并将所有文件写入我找到的具有特定扩展名(.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. 如何递归遍历并记录C#中的HttpRequestMessage的属性?
- 2. 如何递归遍历XPath?
- 3. 树遍历中的递归
- 4. 如何递归遍历目录树并仅查找文件?
- 5. 树遍历递归
- 6. 非法字符在递归目录遍历
- 7. C中的递归目录
- 8. 递归遍历C#中的一棵树从上往下排
- 9. 循环遍历递归列表C
- 10. 来自递归目录遍历的堆栈溢出错误
- 11. 在Ruby中递归遍历一个Hash
- 12. c中的迭代目录遍历
- 13. 如何遍历目录中的文件?
- 14. 如何遍历Common Lisp中的目录?
- 15. 如何遍历Ant中的目录
- 16. 递归遍历二叉树
- 17. 递归循环遍历类
- 18. 遍历表递归查询
- 19. 递归遍历字典
- 20. 树遍历递归计算
- 21. 递归遍历Samba共享?
- 22. 遍历目录
- 23. Bash脚本递归遍历目录,比较和同步文件
- 24. 递归遍历目录,替换函数调用
- 25. 递归目录遍历/树占用大量内存
- 26. Windows批处理文件 - 如何遍历目录中的文件?
- 27. C中没有递归和堆栈的遍历树C
- 28. PHP Windows中的递归Zip目录?
- 29. 如何遍历c#.net中目录中的所有文件?
- 30. 非递归邮递订单遍历
遍历目录是依赖于操作系统的,所以你可能需要告诉我们您正在使用什么操作系统。有一些操作系统无关的库。如果您正在使用其中之一,我们需要知道哪个可以给出一个好的答案。 – 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