我正在为C#使用十六进制编辑器控件,可以在here.中找到源代码和二进制文件。

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

因此,我问控件的作者谁告诉我将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。一切顺利。向文件中添加更多文本,然后单击保存。您会收到一条错误消息。

08-26 18:31
查看更多