我需要实现一个与2009年编写的here非常相似的解决方案,以检索文件的唯一标识符。具体来说,我正在查看答案的ApproachB()
函数和以下行(重写一点以反映新的C#功能):
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
这里的问题是GetFileInformationByHandle映射到从“kernel32.dll”导入的extern
函数。其签名如下:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetFileInformationByHandle(IntPtr hFile, out BY_HANDLE_FILE_INFORMATION lpFileInformation);
类型IntPtr
很好地映射到上面链接的doc.s HANDLE
中的指定类型。但是,Handle
对象上的FileStream
属性已被弃用(obsolete}并替换为SafeFileHandle
,其中不映射到{{ 1}}。
有没有办法克服这个问题,IntPtr
定义可以接受类型extern
?或者,是否有为此目的实施的另一个SafeFileHandle
方法?
答案 0 :(得分:4)
将您的PInvoke签名更改为
select distinct
store_type
from
stores
where
not exists (
select *
from
cities
where
not exists (
select *
from
cities_stores
where
cities_stores.city = cities.city
and cities_stores.store_type = stores.store_type
)
);
或保留它并在您的SafeFileHandle实例上调用方法.DangerousGetHandle(),它将返回您正在搜索的IntPtr。此方法在基类SafeHandle中实现,该类基于此目的而制作。