在遍历本地目录时(根据错误检查到位)出现无效文件错误,但是我无法确切查明是什么原因造成的。有什么明显的原因可能导致这种情况吗?
#define MAX_PATHNAME_LEN 260
int main(int argc, char* argv[])
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
DWORD dwError;
char DirSpec[MAX_PATHNAME_LEN];
argv[0] = "\N:\\Joe\\My Documents\\";
snprintf(DirSpec, "%s\\*", argv[0]);
// Find the first file in the directory.
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf("Invalid file handle. Error is %u.\n", GetLastError());
return (-1);
}
else
{
printf("First file name is %s.\n", FindFileData.cFileName);
// List all the other files in the directory.
while (FindNextFile(hFind, &FindFileData) != 0)
{
printf("Next file name is %s.\n", FindFileData.cFileName);
}
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
printf("FindNextFile error. Error is %u.\n", dwError);
return (-1);
}
}
return (0);
}
目录正确,但是似乎无法在文件夹中正确扫描。我正在使用Visual Studio 2019编写/编译它。
答案 0 :(得分:0)
首先,您不需要定义
#define MAX_PATHNAME_LEN 260
Windows已经定义
#define MAX_PATH 260
第二,如果由于是网络共享而在N:
驱动器之前添加了驱动器,则它必须为\\\\N:\\
,以便转义的字符串为\\N:\
。
第三,您确实应该不写argv[]
。 C标准绝对没有规定它可写,并且您无法知道是否要注销缓冲区的末尾。改用它:
char basePath[] = "\\\\N:\\Joe\\My Documents\\";
您对snprintf(DirSpec, "%s\\*", argv[0]);
的调用不包含目标缓冲区的长度,因此这是如何解决的。试试
snprintf(DirSpec, MAX_PATH, "%s*", basePath);
请注意,已经从格式字符串中删除了反斜杠,因为FindFirstFile()
函数的目录内容通配符为DirPath\*
,并且您的基本路径已经以反斜杠结尾。