【发布时间】:2012-09-08 20:05:13
【问题描述】:
我已经调试过了,但我仍然不知道什么是罪魁祸首。
#ifndef UNICODE
#define UNICODE
#endif
#include <stdio.h>
#include <Windows.h>
void EndWithBackslash(TCHAR* string)
{
if(string[wcslen(string)-1] != TEXT('\\')) wcscat(string,TEXT("\\"));
}
void Browse(const TCHAR* curdir)
{
HANDLE hFoundFile;
WIN32_FIND_DATA foundFileData;
TCHAR buffer[MAX_PATH];
wcscpy(buffer,curdir);
EndWithBackslash(buffer);
SetCurrentDirectory(buffer);
hFoundFile = FindFirstFileEx(TEXT("*"),FINDEX_INFO_LEVELS::FindExInfoBasic,&foundFileData ,FINDEX_SEARCH_OPS::FindExSearchLimitToDirectories ,NULL , NULL);
if(hFoundFile != INVALID_HANDLE_VALUE)
{
do
{
if ((foundFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && wcscmp(foundFileData.cFileName,TEXT(".")) && wcscmp(foundFileData.cFileName,TEXT("..")) )
{
EndWithBackslash(buffer);
wcscat(buffer,foundFileData.cFileName);
wprintf(TEXT("%s\n"),buffer);
Browse(buffer);
}
}
while(FindNextFile(hFoundFile,&foundFileData));
FindClose(hFoundFile);
}
}
int main(void)
{
Browse(TEXT("F:\\"));
system("Pause");
return 0;
}
输出:
F:\$RECYCLE.BIN
F:\$RECYCLE.BIN\S-1-5-21-1271883188-2384997935-49719322-1000
F:\$RECYCLE.BIN\希捷
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0\系统卷信息
F:\$RECYCLE.BIN\Seagate\Seagate Dashboard 2.0\System Volume Information\Video
“第一层”到底长什么样:
你能指出我的错误吗?
【问题讨论】:
-
对其进行更多调试,特别是在递归调用返回时。
-
你为什么
SetCurrentDirectory?相反,编写完整路径会更容易,并且在调试器下也会更清晰。 -
如果您在迭代目录时不断使用
wcscat添加越来越多的数据到同一个缓冲区,那么您现在遇到的问题。相反,您需要保持当前 dir 变量不变,并与找到的项目组合成单独的变量。