具有空间特征的FindNextFile Faild

时间:2017-10-14 13:41:47

标签: c++ winapi

我编写了一个简单的代码,对每个文件夹(子文件夹)中的每个文件执行一些操作。 它的完美效果直到路径伴随着“空间” '角色程序崩溃并且已调用int dirListFiles(char* startDir) { HANDLE hFind; WIN32_FIND_DATAA wfd; char path[MAX_PATH]; sprintf(path, "%s\\*", startDir); std::string fileName; std::string s_path = startDir; std::string fullPath; fprintf(stdout, "In Directory \"%s\"\n\n", startDir); if ((hFind = FindFirstFileA(path, &wfd)) == INVALID_HANDLE_VALUE) { printf("FindFirstFIle failed on path = \"%s\"\n", path); abort(); } BOOL cont = TRUE; while (cont == TRUE) { if ((strncmp(".", wfd.cFileName, 1) != 0) && (strncmp("..", wfd.cFileName, 2) != 0)) { if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { sprintf(path, "%s\\%s", startDir, wfd.cFileName); dirListFiles(path); } else { fileName = wfd.cFileName; fullPath = s_path + "\\" + fileName; std::string fileExt = PathFindExtension(fullPath.c_str()); if (fileExt == ".cpp") { ... Some operation on file } } } cont = FindNextFile(hFind, &wfd); } FindClose(hFind); 。这是功能:

FindNextFile

例如,如果Program Files (x86)想要打开文件名错误和程序退出之间有空格的{{1}}。我可以做些什么来支持空间?有什么问题?

1 个答案:

答案 0 :(得分:1)

空间是目录和文件名中的合法字符。

首先,我建议稍微修改一下你的代码:

if ((hFind = FindFirstFileA(path, &wfd)) == INVALID_HANDLE_VALUE)
{
    printf("FindFirstFIle failed on path = \"%s\". Error %d\n", path, GetLastError());
    return 0; // I think you shouldn't abort on error, just skip this dir.
}

现在检查程序报告的错误代码。

对于某些路径,我遇到了错误#5(访问被拒绝)。例子:

c:\Program Files (x86)\Google\CrashReports\*
c:\ProgramData\Microsoft\Windows Defender\Clean Store\*
c:\Windows\System32\config\*

对于FindFirstFileA无法管理的路径名,有两个代码为#123(无效名称)的情况。要纠正此行为,最好使用函数FindFirstFileW的宽版本。查看c++ folder only search的两个答案。对于新的Windows应用程序,您应该使用广泛版本的API,如果需要,可以使用MultiByteToWideCharWideCharToMultiByte进行转换。

您还有逻辑错误。代码会跳过以点开头的所有目录和文件。