Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么FileShare.ReadWrite在这种情况下不起作用?_C#_File_Pinvoke - Fatal编程技术网

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

C# 为什么FileShare.ReadWrite在这种情况下不起作用?,c#,file,pinvoke,C#,File,Pinvoke,我需要在一个进程的两个不同实例中打开一个文件。我打开文件的两种方式(都在每个进程中)如下所示: m_Stream = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,4*1024,FileOptions.WriteThrough); 及 现在,我意识到这是一个非常特殊的场景,具有interop调用和FileOptions.WriteThrough。但是,FileShare.ReadWri

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

m_Stream = new FileStream(name, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite,4*1024,FileOptions.WriteThrough);


现在,我意识到这是一个非常特殊的场景,具有interop调用和FileOptions.WriteThrough。但是,FileShare.ReadWrite似乎不起作用。第二个进程(使用相同的代码)尝试访问该文件,但另一个进程通常会访问该文件异常。在相同的过程中,似乎可以很好地进行共享。有什么想法吗?

不知道你是怎么得出这个结论的。pinvoke声明不正确,CreateFile的第二个参数与FileAccess不兼容。它需要通用_读取(0x8000000)和通用_写入(0x40000000)的组合。FileShare实际上与winapi标志兼容。要做到这一点,最好使用Reflector或ILSpy或参考源代码,并查看FileStream.Init()的代码。它在FileStream构造函数和CreateFile参数值之间进行映射。

CreateFile p/invoke是从pinvoke.net中提取的-我必须仔细检查这一点。假设FileAccess是错误的,这不只是一个骗局吗?如果FileShare是兼容的,为什么会发生这种情况?@J Trana-Hans是正确的,p/invoke声明是错误的。将定义与p/invoke.net中的
EFileAccess
一起使用,并在下面定义的枚举中复制-这些是传递给
CreateFile
@J Trana的正确值-而且FileAccess错误也不是一种掩饰。发生的情况是,您使用错误的文件访问权限打开文件,并且与FileShare.ReadWrite兼容。FileAccess和FileShare是相互关联的-请参阅@shf301上的表格,谢谢!我不知道这两个参数之间的相互作用。我还必须发到pinvoke.net,这样他们就知道第二个c#签名被破坏了。现在我可以开始运行我的代码了!
            [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);