【发布时间】:2014-02-04 07:15:33
【问题描述】:
有递归查找文件夹中所有文件的功能(存储在logPath文件夹名末尾有'\')。它用于64位控制台应用程序(在MSVC 2008中编译)并在Win7 64位操作系统上运行。
当我运行“program.exe folder_to_find”之类的应用程序时,它运行良好。
当我运行“program.exe folder_to_find >> result.txt”之类的应用程序时,它失败并返回错误 6 (ERROR_INVALID_HANDLE) FindNextFileA(即使没有对大文件夹进行递归调用)。例如。它可以在文件夹中找到前 150 个文件,而不是现有的 240 个。
void FindFiles(const std::string &logPath, FileList& fileList)
{
WIN32_FIND_DATAA fd;
HANDLE f = FindFirstFileA((logPath + "*").c_str(), &fd);
if (f == INVALID_HANDLE_VALUE)
{
printf("No files found at %s - %d\n", logPath.c_str(), GetLastError());
return;
}
FileList dirList;
do
{
if (strcmp(fd.cFileName, ".") == 0)
continue;
if (strcmp(fd.cFileName, "..") == 0)
continue;
std::string path = logPath + fd.cFileName;
printf("Processing %s\n", path.c_str());
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
dirList.push_back(path);
else
fileList.push_back(path);
}
while (FindNextFileA(f, &fd) != 0);
DWORD err = GetLastError();
if (err != ERROR_NO_MORE_FILES)
{
printf("Unexpected error in FindNextFileA(%s): %d\n", logPath.c_str(), err);
fflush(stdout);
abort();
}
FindClose(f);
//for(FileList::const_iterator it = dirList.begin(); it != dirList.end(); ++it)
// FindFiles(*it, fileList);
}
【问题讨论】:
-
结果文件是在您正在搜索的目录中创建的(还是在您正在搜索的目录的子目录中)?如果是这样,可能在搜索目录时打开文件(并被更改)会导致问题。您可能需要进行一些试验,以了解有关导致此问题的条件的更多信息。
-
否,结果文件正在目标目录之外创建。至少程序没有打开任何文件。
-
printf?!为什么不使用
cout?然后你可以避免那些讨厌的c_str()电话。您还必须在关联的 API 调用失败后立即调用GetLastError()。你不会在 Q 的代码中这样做。 -
printf只是一个坏习惯,对不起。正如我所见,GetLastError在FindNextFileA调用之后立即被调用。 -
那个没问题,但是 FindFirstFileA 之后的那个不行。当然
logPath.c_str()不会有问题,但是当你打电话给GetLastError时,要非常准确地了解这是一个好习惯。
标签: winapi visual-c++ console-application