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

时间:2019-04-26 21:36:55

标签: c windows file loops

在遍历本地目录时(根据错误检查到位)出现无效文件错误,但是我无法确切查明是什么原因造成的。有什么明显的原因可能导致这种情况吗?

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

1 个答案:

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