1
我需要在一个进程的两个不同实例中打开一个文件。有两种方式,我打开文件(包括每个进程内)如下:为什么在这种情况下FileShare.ReadWrite不起作用?
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。但是,FileShare.ReadWrite似乎不起作用。尝试访问该文件的第二个进程(使用相同的代码)获取通常的另一个进程正在访问此文件异常。在同一个过程中,似乎很好地共享。有什么想法吗?
CreateFile p/invoke是从pinvoke.net中提取的 - 我得仔细检查一下。假设FileAccess是错误的,是不是只是一个红鲱鱼?如果FileShare兼容,为什么会发生这种情况? –
@J特拉纳 - 汉斯是正确的,p/invoke声明是错误的。使用来自p/invoke.net的'EFileAccess'的定义并复制下面定义的枚举 - 这些是传递给'CreateFile'的正确值。 – shf301
@ J特拉纳 - 也FileAccess错了不是一个红鲱鱼。发生什么情况是您打开的文件是错误的FileAccess,并且与FileShare.ReadWrite兼容。 FileAccess和FileShare相互关联 - 请参阅http://msdn.microsoft.com/en-us/library/aa363874%28VS.85%29.aspx – shf301