我正在使用C#的十六进制编辑器控件,可以找到源代码和二进制文件here.
使用它时的一个问题是,如果在十六进制编辑器和另一个程序中加载了文件,则另一个程序无法保存该文件,因为它已被另一个进程使用。
所以我问控件的作者谁告诉我在FileByteProvider和DynamicFileByteProvider类的File.Open方法中将FileShare参数设置为ReadWrite(它最初只是Read)会修复它。所以我这样做了,但它仍然无效(同样的错误)。将其设置为“仅写入”也不起作用,但将其设置为“只读”和“无”都有效。这些文件在任何程序中都有相同的问题,例如记事本。它们没有设置为ReadOnly或任何东西,所以我不知道为什么它不起作用。
这里有什么我想念的吗?
答案 0 :(得分:9)
问题可能在于其他程序 - 如果它试图打开文件进行独占访问(没有共享),那么你的程序打开文件的方式并不重要 - 它正在运行失败。
每当程序尝试打开文件时,您都会指定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 :(得分:0)
可能您没有正确关闭文件,因此即使您关闭了应用程序(以前的权限设置为Read),它仍然保持打开状态