如果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: 0xX\n", GetLastError());
return 0;
}
FILE_ID_INFO id = {};
if (!GetFileInformationByHandleEx(h, FILE_INFO_BY_HANDLE_CLASS::FileIdInfo, &id, sizeof(id)))
{
printf("FileIdInfo error: 0xX\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: 0xX\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
uj5u.com熱心網友回復:
事實證明我的代碼本身是正確的,但如果下面的檔案系統不支持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,好吧,它只是不讀取/需要該資訊,因此它可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/314726.html
