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 回答