使用C ++中的Win32 API在递归目录遍历期间堆栈溢出

时间:2011-08-01 18:40:45

标签: winapi recursion directory stack overflow

我一直在试图找出为什么这会给我一个堆栈溢出几个小时,可能是一些简单的我只是缺少,它工作得更早,直到我搞砸它试图清理它。无论如何,一些新鲜的眼睛将非常感激。

int scan(LPSTR szPath, LPSTR pattern) {
    WIN32_FIND_DATA WFD;
    HANDLE hSearch;
    CHAR szFullPath [MAX_PATH+1] = "";
    PVOID OldValue = NULL;

    if( Wow64DisableWow64FsRedirection(&OldValue) ) 
    {

        PathCombine(szFullPath, szPath, "*"); 
        hSearch = FindFirstFile(szFullPath, &WFD);
        if ( hSearch != INVALID_HANDLE_VALUE ) {
            while(FindNextFile(hSearch,&WFD)) {
                if(strcmp(WFD.cFileName,"..") || strcmp(WFD.cFileName,".")){
                    FindNextFile(hSearch,&WFD);
                }
                if(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
                    PathCombine(szFullPath, szPath, WFD.cFileName);
                    scan(szFullPath, pattern);
                } 
            }
            FindClose(hSearch);
        }

        PathCombine(szFullPath, szPath, pattern);
        hSearch = FindFirstFile(szFullPath, &WFD);
        if( hSearch != INVALID_HANDLE_VALUE ) {
            while( FindNextFile(hSearch, &WFD) ) {
                if(!(WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                    PathCombine(szFullPath, szPath, WFD.cFileName);
                int index = SendDlgItemMessage(ghWnd, IDLIST, LB_ADDSTRING, 0, (LPARAM)szFullPath);

            }
        }

        FindClose(hSearch);
        if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) )
        {
            return 0;
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:2)

我认为问题在于:

    if(strcmp(WFD.cFileName,"..") || strcmp(WFD.cFileName,".")){
        FindNextFile(hSearch,&WFD);
    }

添加“继续”语句以解决此问题。检查“。”而且“......”很好。问题是如果它们相邻则代码中断。

编辑:具体来说,在此代码块中的FindNextFile之后添加“continue”。

答案 1 :(得分:1)

在第一个循环中尝试此更改:

if(strcmp(WFD.cFileName,"..") || strcmp(WFD.cFileName,".")){
    continue;
}

答案 2 :(得分:0)

在您的特定情况下,您可能会意外地在枚举中包含本地目录,然后再包括本地目录等,从而获得无限递归。

但即使你解决了这个问题,你也会递归地调用scan,如果你不是很小心,很容易导致你的堆栈被打击,并且非常了解你的内存需求,堆栈限制等。

如果你解决了无限递归问题,并且仍然得到堆栈溢出,常见的解决方案是实现自己的堆栈,而不是依赖于递归函数调用。

有关堆栈如何工作的详细信息,请参阅the Stack (data structure) article on wikipedia