0

path如果指向常规目录,我有这段代码运行良好:

#include <windows.h>
#include <stdio.h>

int main()
{
    wchar_t path[1024] = L"C:\\MyPath\\MyDir";
    
    auto h = CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
    if (h == INVALID_HANDLE_VALUE)
    {
        printf("CreateFile error: 0x%08X\n", GetLastError());
        return 0;
    }

    FILE_ID_INFO id = {};
    if (!GetFileInformationByHandleEx(h, FILE_INFO_BY_HANDLE_CLASS::FileIdInfo, &id, sizeof(id)))
    {
        printf("FileIdInfo error: 0x%08X\n", GetLastError());
    }

    unsigned char buffer[4096];
    do
    {
        if (!GetFileInformationByHandleEx(h, FILE_INFO_BY_HANDLE_CLASS::FileIdExtdDirectoryInfo, buffer, ARRAYSIZE(buffer)))
        {
            auto gle = GetLastError();
            if (gle == ERROR_NO_MORE_FILES)
                break;

            printf("FileIdExtdDirectoryInfo error: 0x%08X\n", gle);
            break;
        }

        auto current = buffer;
        do
        {
            auto info = (FILE_ID_EXTD_DIR_INFO*)current;
            wprintf(L"name: %.*s\n", info->FileNameLength / 2, info->FileName);
            if (!info->NextEntryOffset)
                break;

            current += info->NextEntryOffset;
        } while (true);
    } while (true);
    CloseHandle(h);
}

但是如果目录指向一个连接点,它返回(ERROR_INVALID_PARAMETER无效参数)

FileIdInfo error: 0x00000057
FileIdExtdDirectoryInfo error: 0x00000057

所以,我试过这个CreateFile

auto h = CreateFile(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OPEN_REPARSE_POINT, NULL);

现在,我没有错误,但它只显示"."".."条目,而不是我可以使用 cmd.exe 读取的目录中的所有文件

C:\MyPath\MyDir>dir
 Volume in drive C has no label.
 Volume Serial Number is AEA6-688A

 Directory of C:\MyPath\MyDir

20/10/2017  14:08             (157) My Icon.ico
11/04/2018  09:08               321 My File.cpp
30/04/2018  15:14    <DIR>          My dossier
19/09/2019  10:40          (41 650) New Rich Text Document.rtf
10/10/2021  11:06                 0 New Text Document.txt
               4 File(s)         46 224 bytes
               1 Dir(s)  544 625 274 880 bytes free
4

1 回答 1

1

事实证明我的代码本身是正确的,但是如果下面的文件系统不支持NTFS object ID ,它可能会失败,因为这是它试图读取的内容(使用 FILE_INFO_BY_HANDLE_CLASS::FileIdInfo 和 FILE_INFO_BY_HANDLE_CLASS::FileIdExtdDirectoryInfo )。

例如,如果目录是 NTFS挂载点,其替代名称指向未设置FILE_SUPPORTS_OBJECT_IDS标志的卷(在虚拟驱动器方案中可见),则会发生这种情况。

这里的错误 ( ERROR_INVALID_PARAMETER) 有点误导,因为任何参数都没有问题(可能除了那个FileInformationClass),我本来预计会出现一些“不支持”的错误。

至于 cmd.exe,好吧,它只是不读取/不需要该信息,因此可以正常工作。

于 2021-10-11T14:45:47.200 回答