我试图找出如何处理这个东西了出于某种原因,它在某个时候结束..我不是很好的recursion,我敢肯定,问题在于那里..
此外,即使我检查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的子文件夹,它枚举testing中的所有内容,但是不能枚举指定的原始目录中的文件。
从FindFirstFile文档:
如果函数失败或无法从lpFileName参数中的搜索字符串中查找文件,则返回值为INVALID_HANDLE_VALUE,并且lpFindFileData的内容是不确定的。
你只能退出一个迭代而不是整个程序:
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 );
你正在改变你的本地wrkdir
变量的值:
wrkdir = wrkdir + L"\\" + file_data.cFileName; find_files( wrkdir );
我想你必须像这样调用find_files
:
find_files( wrkdir + L"\\" + file_data.cFileName );
而不是改变wrkdir
的值。
您的代码中仍然存在一些错误。 试试这个:
void find_files( wstring wrkdir ) { wstring wrkdirtemp = wrkdir; if( !wrkdirtemp.empty() && (wrkdirtemp[wrkdirtemp.length()-1] != L'\\') ) { wrkdirtemp += L"\\"; } WIN32_FIND_DATA file_data = {0}; HANDLE hFile = FindFirstFile( (wrkdirtemp + L"*").c_str(), &file_data ); if( hFile == INVALID_HANDLE_VALUE ) { return; } do { if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { if( (wcscmp(file_data.cFileName, L".") != 0) && (wcscmp(file_data.cFileName, L"..") != 0) ) { find_files( wrkdirtemp + file_data.cFileName ); } } else { if( (file_data.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM)) == 0 ) { results << wrkdirtemp << file_data.cFileName << endl; } } } while( FindNextFile( hFile, &file_data ); FindClose( hFile ); }
使用dirent.h进行递归文件搜索
#include <iostream> #include <dirent.h> #include <string.h> bool isUpDirecory(const char* directory) { if (strcmp(directory, "..") == 0 || strcmp(directory, ".") == 0) return true; else return false; } bool findFile(const std::string& fileName, const std::string& path, std::string& resultPath) { dirent* entry; DIR* dir = opendir(path.c_str()); if (dir == NULL) return false; while ((entry = readdir(dir)) != NULL) { if (entry->d_type == DT_REG) { if (fileName.compare(entry->d_name) == 0) { resultPath = path + "/" + entry->d_name; closedir(dir); return true; } } } rewinddir(dir); while ((entry = readdir(dir)) != NULL) { if (entry->d_type == DT_DIR) { if (!isUpDirecory(entry->d_name)) { std::string nextDirectoryPath = path + "/" + entry->d_name; bool result = findFile(fileName, nextDirectoryPath, resultPath); if (result == true) { closedir(dir); return true; } } } } closedir(dir); return false; } int main() { std::string path; bool result = findFile("text.txt", "/home/lamerman/", path); std::cout << path << std::endl; return 0; }
另外,请查看CFileFind MFC类的实现。
您的代码中仍然存在错误:
此外,我认为你可以通过更多关注FindFirstFile文档中提供的MSDN示例来解决代码中的所有问题。