0

作为我正在处理的应用程序的一部分,我需要计算目录中的所有文件及其子目录。我写了一个递归函数,但奇怪的是它并没有计算大目录中的所有文件——不过它在较小的目录上工作得很好。

在一个有 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 的指针。

谁能告诉我我做错了什么?我在这里阅读了一些类似的帖子,但似乎都没有处理这个特定问题。

4

1 回答 1

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;
}

感谢您的评论安迪徘徊 - 你让我找到了正确的地方:)

于 2013-02-03T16:43:40.950 回答