2011-09-09 190 views
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似乎不起作用。尝试访问该文件的第二个进程(使用相同的代码)获取通常的另一个进程正在访问此文件异常。在同一个过程中,似乎很好地共享。有什么想法吗?

回答

2

不知道你是如何得出这个结论的。 pinvoke声明不好,CreateFile的第二个参数是而不是与FileAccess兼容。它需要GENERIC_READ(0x8000000)和GENERIC_WRITE(0x40000000)的组合。 FileShare实际上与winapi标志兼容。最好的选择是使用Reflector或ILSpy或Reference Source并查看FileStream.Init()的代码。它执行FileStream构造函数和CreateFile参数值之间的映射。

+0

CreateFile p/invoke是从pinvoke.net中提取的 - 我得仔细检查一下。假设FileAccess是错误的,是不是只是一个红鲱鱼?如果FileShare兼容,为什么会发生这种情况? –

+1

@J特拉纳 - 汉斯是正确的,p/invoke声明是错误的。使用来自p/invoke.net的'EFileAccess'的定义并复制下面定义的枚举 - 这些是传递给'CreateFile'的正确值。 – shf301

+2

@ J特拉纳 - 也FileAccess错了不是一个红鲱鱼。发生什么情况是您打开的文件是错误的FileAccess,并且与FileShare.ReadWrite兼容。 FileAccess和FileShare相互关联 - 请参阅http://msdn.microsoft.com/en-us/library/aa363874%28VS.85%29.aspx – shf301

相关问题