c – 递归文件搜索

我正在试图弄清楚如何解决这个问题……出于某种原因,它在某个时刻结束了……我不太擅长递归,我确信问题出在某处……

此外,即使我检查了cFileName!=“..”,它仍然显示在最后,不知道为什么,但“.”不再显示..

void find_files( wstring wrkdir )
{
    wstring temp;

    temp = wrkdir + L"\\" + L"*"; 
    fHandle = FindFirstFile( temp.c_str(), &file_data );

    if( fHandle == INVALID_HANDLE_VALUE )
    {
         return;
    }
    else 
    { 
        while( FindNextFile( fHandle, &file_data ) ) 
        {
            if( file_data.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
                wcscmp(file_data.cFileName, L".") != 0 && 
                        wcscmp(file_data.cFileName, L"..") != 0 )
            {
                find_files( wrkdir + L"\\" + file_data.cFileName  );
            }
            else if( file_data.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN && 
                 file_data.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM  )
            {
                results << wrkdir << "\\" << file_data.cFileName << endl;
            }
        }
    }
}

更改后,程序不会枚举剩下的剩余文件..

例如,如果有一个名为test的子文件夹,它会枚举test中的所有内容,但不会完成枚举指定的原始目录中的文件.

FindFirstFile文档:

If the function fails or fails to
locate files from the search string in
the lpFileName parameter, the return
value is INVALID_HANDLE_VALUE and the
contents of lpFindFileData are
indeterminate.

您应该只退出一次迭代而不是整个程序:

if( fHandle == INVALID_HANDLE_VALUE )
   {
     return;
   }

这可能会解决您的其他问题:

else if( file_data.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN && 
   file_data.dwFileAttributes != FILE_ATTRIBUTE_SYSTEM  &&
   wcscmp(file_data.cFileName, L".") != 0 && 
   wcscmp(file_data.cFileName, L"..") != 0
 )
{
    results << wrkdir << "\\" << file_data.cFileName << endl;
}

另请参阅@ fretje的答案.它给你的代码带来了另一个问题.

更新新:您需要将fHandle用作局部变量,而不是全局变量.

改成:

HANDLE fHandle = FindFirstFile( temp.c_str(), &file_data );
相关文章
相关标签/搜索