我需要在进程的两个不同实例中打开一个文件。我打开文件的两种方式(在每个进程中都有)如下:
m_Stream = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,4*1024,FileOptions.WriteThrough);
和
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern SafeFileHandle CreateFile(
string fileName,
[MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
[MarshalAs(UnmanagedType.U4)] FileShare fileShare,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
int flags,
IntPtr template);
m_Stream = new FileStream( //no buffering
CreateFile(name, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0x20000000, IntPtr.Zero),
FileAccess.ReadWrite);
现在我意识到这是一个非常专业的场景,包括interop调用和FileOptions.WriteThrough。但是,FileShare.ReadWrite似乎不起作用。尝试访问该文件的第二个进程(使用相同的代码)通常会有另一个进程正在访问此文件异常。在同一个过程中,似乎可以正常分享。有什么想法吗?
答案 0 :(得分:2)
不确定你是如何得出结论的。 pinvoke声明很糟糕,CreateFile的第二个参数不与FileAccess兼容。它需要GENERIC_READ(0x8000000)和GENERIC_WRITE(0x40000000)的组合。 FileShare实际上与winapi标志兼容。要做到这一点,最好的办法是使用Reflector或ILSpy或Reference Source,然后查看FileStream.Init()的代码。它执行FileStream构造函数和CreateFile参数值之间的映射。