Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文件共享读写不工作(C#.NET)_C#_File_Fileshare - Fatal编程技术网

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

文件共享读写不工作(C#.NET),c#,file,fileshare,C#,File,Fileshare,我正在为C#使用一个十六进制编辑器控件,可以找到源代码和二进制文件 使用它时的一个问题是,如果在十六进制编辑器和另一个程序中加载了一个文件,另一个程序将无法保存该文件,因为它已被另一个进程使用 因此,我要求控件的作者在File中设置FileShare参数。FileByteProvider中的Open方法和DynamicFileByteProvider类中的ReadWrite(最初仅为Read)将修复此问题。所以我就这么做了,但还是不起作用(同样的错误)。将其设置为仅写也不起作用,但将其设置为只读

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

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

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

这里有我遗漏的东西吗

  • 更改为读写
  • 重新编译
  • 尝试打开尚未尝试打开的文件,并检查是否出现问题

  • 可能是您没有适当地关闭文件,因此即使在您关闭应用程序(以前的权限设置为“读取”)后,文件仍保持打开状态。

    问题可能在于其他程序-如果它试图以独占访问方式打开文件(无共享),不管你的程序如何打开文件,它都会失败


    每当一个程序试图打开一个文件时,您都会指定一个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
            }
        }
    }
    
    使用System.IO;
    命名空间控制台应用程序2
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    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();//记事本是一个允许读写的程序示例。我可以在记事本和另一个程序中打开一个文件,并在这两个程序中进行更改,而没有任何问题。但是使用这个十六进制编辑器,我不能,其他一些程序也会这样(它们工作正常)。这就是为什么我认为十六进制编辑器有问题。我刚刚读了你编辑的文章。我很想知道为什么记事本可以打开一个共享的文件进行读/写,但不能写回文件?此外,即使你在这个意义上是对的,我100%肯定十六进制编辑器仍然有问题,因为打开的文件h该程序和另一个程序可以很好地处理同一个文件。这让我觉得该程序中的文件共享也设置为读/写。但是,是的,我很有兴趣了解更多关于您的第一条语句的信息。@Iceyoshi-因为当记事本试图回写该文件时,它会更改其访问权限(或重新打开该文件)并指定
    FileShare.None
    FileShare.Read
    (实际上是Win32的等价物,据我所知它不是.Net)-这与我的程序的
    文件访问不兼容。ReadWrite
    这里的“适当”是什么意思?我已经用许多不同的文件尝试过,问题似乎都存在。适当关闭意味着完全关闭:)我没有时间分析你的代码,所以我假设文件不是c完全失败了。