gpt4 book ai didi

c - 在 Windows 上迭代目录时查找句柄无效

转载 作者:行者123 更新时间:2023-11-30 16:18:32 26 4
gpt4 key购买 nike

在迭代本地目录时(根据到位的错误检查),我遇到了无效文件错误,但是我无法准确找出导致此问题的原因。有什么明显的原因可能导致这种情况吗?

#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 来编写/编译它。

最佳答案

首先,您不需要定义

#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\* ,并且您的基本路径已经以反斜杠结尾。

关于c - 在 Windows 上迭代目录时查找句柄无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55875203/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com