为什么是FileShare ?读写在此场景中不起作用
本文关键字:不起作用 FileShare 读写 为什么 | 更新日期: 2023-09-27 18:08:15
我需要在一个进程的两个不同实例中打开一个文件。我打开文件的两种方式(都在每个进程中)如下:
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);
现在我意识到这是一个非常专业的场景,具有互操作调用和FileOptions.WriteThrough。然而,文件共享。读写似乎不工作。第二个进程(使用相同的代码),试图访问该文件得到通常另一个进程正在访问此文件异常。在相同的过程中,似乎可以很好地用于共享。任何想法吗?
不知道你是怎么得出这个结论的。pinvoke声明是错误的,CreateFile的第二个参数与FileAccess不兼容。它需要GENERIC_READ (0x8000000)和GENERIC_WRITE (0x40000000)的组合。FileShare实际上与winapi标志兼容。要做到这一点,最好的办法是使用Reflector或ILSpy或参考源代码,并查看FileStream.Init()的代码。它在FileStream构造函数和CreateFile参数值之间进行映射。