2016-04-13 13 views
0

ディレクトリの識別子を取得する目的でdirectory handleを取得しようとしています。 (その上にリンクされている)文書は、CreateFile関数にFILE_FLAG_BACKUP_SEMANTICSフラグを渡す必要があることを指定して、ハンドル自体を取得します。CreateFile、FILE_FLAG_BACKUP_SEMANTICS、ディレクトリ管理とハンドル

はしかし、pinvoke'skernel32.dll署名をコンサルティングで、ほとんどのC#の候補者は、次のようになります。C++ CreateFile

[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 
    ); 

上記一対一のパラメータのマッピングは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の署名を変更する必要はありますか?

+0

(FileAttributes)キャストを適用する以外に、パラメータを* uint *として簡単に宣言することができます。 –

+0

@HansPassantは、extern署名がdllに解決する能力に影響しますか? – Thomas

+1

いいえ、これはCの関数です。名前だけでエクスポートされ、パラメータタイプは何の役割も果たしません。 winapi関数に特有の呼び出し規約で飾られていなくても、単純な "CreateFile"です。 –

答えて

1

は、あなたのコード内でこの列挙定義を含める:

[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に定義されているファイル属性は多くの属性が含まれていません。

関連する問題