FileShare ReadWrite不起作用(C#.NET)

我正在使用C#的hex编辑器控件,可以在这里找到源代码和二进制文件。

使用它时的一个问题是,如果在hex编辑器和另一个程序中加载了文件,则另一个程序无法保存该文件,因为它已被另一个进程使用。

所以我问控件的作者谁告诉我在FileByteProvider和DynamicFileByteProvider类的File.Open方法中将FileShare参数设置为ReadWrite(它最初只是Read)会修复它。 所以我这样做了,但它仍然无效(同样的错误)。 将其设置为“仅写入”也不起作用,但将其设置为“只读”和“无”都可以。 这些文件在任何程序中都有相同的问题,例如记事本。 它们没有设置为ReadOnly或任何东西,所以我不知道为什么它不起作用。

这里有什么我想念的吗?

问题可能在于其他程序 – 如果它试图打开文件以进行独占访问(没有共享),那么程序打开文件的方式并不重要 – 它会失败。


每当程序尝试打开文件时,都指定FileAccess和FileShare参数(如果未显式传递,则采用默认值)。

Windows然后要做的是检查所有现有的打开文件句柄,并确定它们是否兼容。 因此,它将您的FileAccess参数与其他人的FileShare参数进行比较 – 您是否可以做其他人所说的他们很高兴其他人做的事情? 然后它执行相反的检查 – 您的FileShare参数是否与其FileAccess参数匹配? – 他们做的事情让你感到高兴吗? 只有两个检查都通过才能批准您的特定开放请求。

您可以使用Process Monitor之类的东西来实际观察发给CreateFile的Win32调用,以查看每个进程实际执行的操作。


记事本可以打开已为读/写共享的文件,但无法写回文件。 示例程序:

using System.IO; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3); fs.Flush(); fs.Close(); //<-- Breakpoint here } } } 

设置给定的断点,运行程序。 当它到达断点时,打开记事本,并使用它打开C:\ Bar.txt。 一切都好。 在文件中添加更多文本并点击保存。 你会收到一条错误信息。

  1. 更改为ReadWrite。
  2. 重新编译。
  3. 尝试打开尚未尝试打开的文件,然后检查问题是否出现。

可能是您没有正确关闭文件,因此即使在您关闭应用程序之后它仍保持打开状态(以前的权限设置为Read)