我正在试图弄清楚如何解决这个问题……出于某种原因,它在某个时刻结束了……我不太擅长递归,我确信问题出在某处…… 此外,即使我检查了cFileName!=“..”,它仍然显示在最后,不知道
此外,即使我检查了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 );