计算目录及其子目录中的所有文件

时间:2013-02-03 13:31:42

标签: c++ visual-c++

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

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

谁能告诉我我做错了什么?我在这里读了几篇类似的帖子,但似乎没有一篇文章能解决这个问题。

1 个答案:

答案 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 - 你让我在正确的地方寻找:)