2016-04-12 4 views
0

私は、ファイルのユニークな識別子を取得するために、2009年に書かれたhereと非常に似たソリューションを実装する必要があります。具体的には、私は答えのApproachB()機能で探していて、次の行(新しいC#の機能を反映するために再書かれたビット):ハンドル(IntPtr)kernel32.dll、SafeFileHandle to IntPtr

var fi = new FileInfo(@"C:\Temp\testfile.txt"); 
var fs = fi.Open(FileMode.Open,FileAccess.Read,FileShare.ReadWrite); 
WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo); // fs.Handle being the portion in question 

問題、ここでは、からの輸入extern機能へのGetFileInformationByHandleマップです"kernel32.dll"。以下の通りのシグネチャは、次のとおり

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation); 

種類以上の連結doc.s HANDLEで指定されたタイプのウェルIntPtrマップ。ただしFileStreamオブジェクトのHandleプロパティは廃止され(obsoleteとなりました)、SafeFileHandleに置き換えられました。はにマップされていません。にマップされています。

これは、externの定義でタイプSafeFileHandleを受け入れることができる場所を克服する方法がありますか?または、この目的のために別のexternメソッドが実装されていますか?

答えて

2

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool GetFileInformationByHandle(SafeFileHandle hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation); 

にあなたのPInvokeシグネチャを変更するか、それを維持し、あなたのSafeFileHandleインスタンスあなたが探しているのIntPtrを返します方法.DangerousGetHandle()を呼び出す

。このメソッドは、その目的のために作られた基本クラスSafeHandleに実装されています。

関連する問題