gpt4 book ai didi

c# - 文件共享读写不工作 (C#.NET)

转载 作者:行者123 更新时间:2023-11-30 19:32:53 24 4
gpt4 key购买 nike

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

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

所以我问了控件的作者,他告诉我将FileByteProvider和DynamicFileByteProvider类中的File.Open方法中的FileShare参数设置为ReadWrite(它最初只是Read)会修复它。所以我这样做了,但它仍然没有用(同样的错误)。将其设置为 Write only 也不起作用,但将其设置为 Read only 和 None 都有效。这些文件在任何程序中都有同样的问题,例如记事本。它们未设置为 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。一切安好。向文件中添加更多文本并点击保存。您会收到一条错误消息。

关于c# - 文件共享读写不工作 (C#.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4689904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com