recursion文件search

我试图找出如何处理这个东西了出于某种原因,它在某个时候结束..我不是很好的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类的实现。

您的代码中仍然存在错误:

  1. 你忽略了第一个搜索的结果。 你调用FindFirstFile并处理失败。 但是,如果成功,则不会处理已获取的file_data,并使用FindNextFile覆盖它。
  2. 您不关闭搜索句柄。 为此使用FindClose。
  3. 从现有的代码看来,fHandle似乎是全球性的 – 不应该这样做。 这会打破你的递归。

此外,我认为你可以通过更多关注FindFirstFile文档中提供的MSDN示例来解决代码中的所有问题。