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

コメントありがとうございますAndyProwl-あなたは私を正しい場所に探しさせました:)

于 2013-02-03T16:43:40.950 に答える