为什么FileShare.ReadWrite在这种情况下不起作用?

时间:2011-09-09 22:39:40

标签: c# file pinvoke

我需要在进程的两个不同实例中打开一个文件。我打开文件的两种方式(在每个进程中都有)如下:

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似乎不起作用。尝试访问该文件的第二个进程(使用相同的代码)通常会有另一个进程正在访问此文件异常。在同一个过程中,似乎可以正常分享。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

不确定你是如何得出结论的。 pinvoke声明很糟糕,CreateFile的第二个参数与FileAccess兼容。它需要GENERIC_READ(0x8000000)和GENERIC_WRITE(0x40000000)的组合。 FileShare实际上与winapi标志兼容。要做到这一点,最好的办法是使用Reflector或ILSpy或Reference Source,然后查看FileStream.Init()的代码。它执行FileStream构造函数和CreateFile参数值之间的映射。