作为我正在处理的应用程序的一部分,我需要计算目录中的所有文件及其子目录。我编写了一个递归函数,但奇怪的是它没有计算大型目录中的所有文件 - 它在较小的目录上工作正常。
在一个包含16个文件的目录中(其中8个在子目录中)它工作正常,但在大约500个文件夹中的8000个文件上进行测试时,它停止了760个文件的计数。
代码是:
void RecursiveSearch(wchar_t* param, int* pFiles)
{
HANDLE hFind;
WIN32_FIND_DATA wfd;
wchar_t* junk = new wchar_t [2];
StringCchPrintf(junk,2,L".");
wchar_t* path = new wchar_t [MAX_PATH];
StringCchPrintf(path,MAX_PATH,L"%s\\*",param);
hFind = FindFirstFile(path,&wfd);
do {
if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
wchar_t* tpath = new wchar_t [MAX_PATH];
StringCchPrintf(tpath,MAX_PATH,L"%s%s\\*",param,wfd.cFileName);
if (wfd.cFileName[0] == junk[0]) {
delete [] tpath; //filter for '.' directories
} else {
RecursiveSearch(tpath,pFiles);
delete [] tpath;
}
} else {
++*pFiles;
}
} while (FindNextFile(hFind,&wfd) == TRUE);
delete [] junk, param, path;
return;
}
'param'传递文件路径(不带\),'pFiles'是指向包含文件数的int的指针。
谁能告诉我我做错了什么?我在这里读了几篇类似的帖子,但似乎没有一篇文章能解决这个问题。
答案 0 :(得分:0)
我刚发现问题,在添加新目录名时看起来没有删除*,导致路径不正确。改进的代码如下。
void RecursiveSearch(wchar_t* param, int* pFiles)
{
HANDLE hFind;
WIN32_FIND_DATA wfd;
wchar_t* junk= new wchar_t [2];
StringCchPrintf(junk,2,L".");
wchar_t* path = new wchar_t [MAX_PATH];
StringCchPrintf(path,MAX_PATH,L"%s*",param);
hFind = FindFirstFile(path,&wfd);
do {
if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
wchar_t* tPath = new wchar_t [MAX_PATH];
//Remove misplaced stars
wchar_t* locator = new wchar_t [2];
StringCchPrintf(locator,2,L"\\");
wchar_t* cleanParam = new wchar_t [MAX_PATH];
for (int i = 0; i < MAX_PATH; i++) {
if (param[MAX_PATH-i] == locator[0]) {
StringCchPrintf(cleanParam,(MAX_PATH-i)+2,L"%s",param);
break;
}
}
StringCchPrintf(tPath,MAX_PATH,L"%s%s\\*",cleanParam,wfd.cFileName);
if (wfd.cFileName[0] == junk[0]) {
delete [] tPath;
} else {
RecursiveSearch(ebx,pFiles);
delete [] tPath;
}
}
else{
++*pFiles;
}
} while (FindNextFile(hFind,&wfd) == TRUE);
delete [] junk, param, path;
return;
}
感谢你的评论Andy Prowl - 你让我在正确的地方寻找:)