我编写了一个简单的代码,对每个文件夹(子文件夹)中的每个文件执行一些操作。
它的完美效果直到路径伴随着“空间”
'角色程序崩溃并且已调用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}}。我可以做些什么来支持空间?有什么问题?
答案 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,如果需要,可以使用MultiByteToWideChar
和WideCharToMultiByte
进行转换。
您还有逻辑错误。代码会跳过以点开头的所有目录和文件。