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