我正在使用以下代码
#include "stdafx.h"
#include <iostream>
#include "stdafx.h"
#include <windows.h>
#include <string>
#include <commdlg.h>
#include <Shlwapi.h>
#pragma comment (lib, "Shlwapi.lib")
// This function is an abomination -- I just wrote it to be quick.
std::wstring CombinePaths(std::wstring const &pattern, LPCWSTR filename) {
std::wstring tmp(pattern);
tmp.push_back('\0');
PathRemoveFileSpec(&tmp[0]);
std::wstring retVal(MAX_PATH, '\0');
PathCombine(&retVal[0], tmp.c_str(), filename);
return retVal.c_str();
}
void FindFiles(std::wstring const &pattern) {
WIN32_FIND_DATA fd;
HANDLE h = FindFirstFile(pattern.c_str(), &fd);
if (h == INVALID_HANDLE_VALUE) {
wprintf(L"FindFirstFile. Err=%d\n", GetLastError());
return;
}
do {
std::wstring fullPath = CombinePaths(pattern, fd.cFileName);
wprintf(L"FullPath=%s\n", fullPath.c_str());
} while (FindNextFile(h, &fd));
FindClose(h);
}
int main()
{
FindFiles(L"c:\\Windows"); //Passes
FindFiles(L"c:\\"); //Fails
std::cin.get();
return 0;
}
为什么不传递C:\\
?有什么建议吗?
答案 0 :(得分:1)
来自FindFirstFile()
文档:
HANDLE WINAPI FindFirstFile( _In_ LPCTSTR lpFileName, _Out_ LPWIN32_FIND_DATA lpFindFileData );
参数
lpFileName [in]
目录或路径以及文件名。文件名可以包含通配符,例如星号(*)或问号(?)。
此参数不应为NULL,无效字符串(例如,空字符串或缺少终止空字符的字符串),或以尾部反斜杠()结尾。
(强调我的)
这意味着您无法通过C:\
作为参数并期望它能够正常工作。
也就是说,您不应该使用FindFirstFile()
来检查目录是否存在。这有点像用12号霰弹枪杀死一只蚊子:它有效,但它有点矫枉过正。
GetFileAttributes()
是您应该使用的功能。