0

システム ボリュームでのみ失敗します。

#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("..")) )
            {   
                 TCHAR pszItemPath[MAX_PATH];
                 wcscpy(pszItemPath, buffer);


                EndWithBackslash(pszItemPath);
                wcscat(pszItemPath,foundFileData.cFileName);
                wprintf(TEXT("%s\n"),pszItemPath);

                Browse(pszItemPath);
            }
        }
        while(FindNextFile(hFoundFile,&foundFileData));     
    }
    FindClose(hFoundFile);
}

int main(void) 
{   
    _wsystem(TEXT("chcp 65001"));
    Browse(TEXT("C:\\"));

    _wsystem(TEXT("Pause"));
    return 0;
}

実行時エラーの直前の出力の最後の行:

C:\$Recycle.Bin\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S- 1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1- 5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5- 20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\ S-1-5-20\S-1-5-20\S-1-5-20\S-1-5\S-1-5-20 C:\$Recycle.Bin\S-1-5 -20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20 \S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S -1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1 -5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5 -20\S-1-5-20\S-1-5\S-1-5-20 C:\$Recycle.Bin\S-1-5-20\S-1-5-20\S- 1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1- 5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5- 20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\ S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S-1-5-20\S- 1-5 \S-1-5-20

それを修正するエレガントな方法はありますか?この擬似ディレクトリを削除したり(スーパーユーザーが非常によく説明しています)、アルゴリズム内で名前フィルターを設定したりしたくありません。

4

1 に答える 1

1

SetCurrentDirectoryが現在のディレクトリを変更できなかったため、スタック オーバーフロー エラーが原因でクラッシュが発生しました。Roman R.が述べたように、 の結果を確認する必要がありますSetCurrentDirectory。さらに、.および..サブディレクトリは、現在のディレクトリと親ディレクトリを参照するため、処理されるべきではありません。それらをプロセスに含めると、スタック オーバーフロー エラーも発生します。

Browse固定機能はこちら。

void Browse(const TCHAR* curdir)
{
    HANDLE hFoundFile;
    WIN32_FIND_DATA foundFileData;
    TCHAR buffer[MAX_PATH];

    wcscpy(buffer,curdir);

    EndWithBackslash(buffer);

    if (!SetCurrentDirectory(buffer)) return;

    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(".."))) )
            {   
                 TCHAR pszItemPath[MAX_PATH];
                 wcscpy(pszItemPath, buffer);


                EndWithBackslash(pszItemPath);
                wcscat(pszItemPath,foundFileData.cFileName);
                wprintf(TEXT("%s\n"),pszItemPath);

                Browse(pszItemPath);
            }
        }
        while(FindNextFile(hFoundFile,&foundFileData));     
    }
    FindClose(hFoundFile);
}
于 2012-09-09T16:28:58.613 に答える