[英]CreateFile, FILE_FLAG_BACKUP_SEMANTICS, Directory Management and Handles
我試圖抓住目錄句柄 ,以檢索目錄的標識符。 文檔(在上面鏈接)指定需要將FILE_FLAG_BACKUP_SEMANTICS
標志傳遞給CreateFile
函數,以檢索句柄本身。
但是,在查詢pinvoke的 kernel32.dll
簽名時,大多數C#候選者如下所示:
[DllImport("kernell32.dll", SetLastError = true)]
public static extern SafeFileHandle CreateFile(
string lpFileName,
[MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess,
[MarshalAs(UnmanagedType.U4)] FileShare dwShareMode,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile
);
上面到C ++ CreateFile的一對一參數映射意味着dwFlagsAndAttributes
參數是FILE_FLAG_BACKUP_SEMANTICS
的占位符; 但是, FileAttribute
枚舉似乎與該標志不匹配。
現在(它壞了),我的呼叫看起來像:
var createdFolder =
FileSystemInteractor.CreateFile(
fullPathWithFolderName,
FileAccess.Read,
FileShare.Read,
IntPtr.Zero,
FileMode.Open,
Kernel32.FILE_FLAG_BACKUP_SEMANTICS,
IntPtr.Zero
);
Kernel32
顯然包含正確的標志。 返回的編譯器錯誤為:
無法從“ uint”轉換為“ System.IO.FileAttributes”
錯誤是有道理的; 我只是不確定我能做些什么簽名,因為我是extern
函數的新手。
是否有一個FileAttributes
對應於所需的標志? 我需要更改extern
簽名嗎?
在您的代碼中包含以下枚舉定義:
[Flags]
private enum File_Attributes : uint
{
Readonly = 0x00000001,
Hidden = 0x00000002,
System = 0x00000004,
Directory = 0x00000010,
Archive = 0x00000020,
Device = 0x00000040,
Normal = 0x00000080,
Temporary = 0x00000100,
SparseFile = 0x00000200,
ReparsePoint = 0x00000400,
Compressed = 0x00000800,
Offline = 0x00001000,
NotContentIndexed = 0x00002000,
Encrypted = 0x00004000,
Write_Through = 0x80000000,
Overlapped = 0x40000000,
NoBuffering = 0x20000000,
RandomAccess = 0x10000000,
SequentialScan = 0x08000000,
DeleteOnClose = 0x04000000,
BackupSemantics = 0x02000000,
PosixSemantics = 0x01000000,
OpenReparsePoint = 0x00200000,
OpenNoRecall = 0x00100000,
FirstPipeInstance = 0x00080000
}
System.IO中定義的文件屬性不包含許多屬性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.