我正在使用 C# 的十六进制编辑器控件,可以找到源代码和二进制文件here.
使用它时的一个问题是,如果在十六进制编辑器和另一个程序中加载文件,则另一个程序无法保存该文件,因为它已经被另一个进程使用。
所以我询问了控件的作者,他告诉我将 FileByteProvider 和 DynamicFileByteProvider 类中的 File.Open 方法中的 FileShare 参数设置为 ReadWrite(最初只是 Read)即可解决此问题。所以我这样做了,但它仍然不起作用(同样的错误)。将其设置为“只写”也不起作用,但将其设置为“只读”和“无”都可以。这些文件在任何程序(例如记事本)中都存在相同的问题。它们没有设置为只读或其他任何东西,所以我不知道为什么它不起作用。
我在这里缺少什么吗?
问题可能出在其他程序上 - 如果它尝试打开文件以进行独占访问(不共享),则无论如何your程序已打开该文件 - 它将失败。
每当程序尝试打开文件时,您都需要指定 FileAccess 和 FileShare 参数(如果未显式传递,则采用默认值)。
然后 Windows 要做的就是检查所有现有的打开文件句柄,并确定它们是否兼容。因此,它将您的 FileAccess 参数与其他人的 FileShare 参数进行比较 -你可以做其他人都说他们乐意做的事吗?然后它执行相反的检查 - 您的 FileShare 参数是否与其 FileAccess 参数匹配? -他们正在做你乐意做的事情吗?只有两项检查都通过后,您的特定开放请求才能获得批准。
你可以使用类似的东西过程监控器实际观察发出的 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。一切安好。向文件添加更多文本并点击“保存”。您会收到一条错误消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)