簡體   English   中英

CreateFile,FILE_FLAG_BACKUP_SEMANTICS,目錄管理和句柄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM