【问题标题】:FileShare ReadWrite not working (C#.NET)文件共享读写不起作用(C#.NET)
【发布时间】:2011-06-09 01:28:38
【问题描述】:

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

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

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

这里有什么我遗漏的吗?

【问题讨论】:

    标签: c# file fileshare


    【解决方案1】:

    问题可能出在其他程序上 - 如果它试图打开文件以进行独占访问(不共享),那么 您的 程序如何打开文件并不重要 - 它会继续失败。


    当程序尝试打开文件时,您需要指定 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。一切顺利。在文件中添加更多文本并点击保存。您会收到一条错误消息。

    【讨论】:

    • 记事本是我认为允许读写的程序示例。我可以在记事本和另一个程序中打开一个文件,并在两者中进行更改而不会出现任何问题。但是使用这个十六进制编辑器,我不能,而且其他一些程序也会发生同样的情况(它们工作正常)。这就是让我认为这是十六进制编辑器的问题。
    • 我刚刚阅读了您编辑的帖子。我很想知道为什么记事本可以打开一个为读/写共享的文件,但不能写回该文件?此外,即使您在这个意义上是对的,我 100% 确定十六进制编辑器仍然存在问题,因为使用该程序打开的文件和另一个程序可以很好地处理同一个文件。这让我觉得文件共享在该程序中也设置为读/写。但是,是的,我很想知道更多关于你的第一个陈述的信息。
    • @Iceyoshi - 因为当记事本试图写回文件时,它会更改它的访问权限(或重新打开文件)并指定 FileShare.NoneFileShare.Read(嗯,实际上是 Win32 等价物,它是据我所知,不是 .Net)- 这与我的程序的 FileAccess.ReadWrite 不兼容
    【解决方案2】:
    1. 改为读写。
    2. 重新编译。
    3. 尝试打开您尚未尝试打开的文件并检查是否出现问题。

    可能是您没有正确关闭文件,因此即使在您关闭应用程序后它仍保持打开状态(之前的权限设置为读取)

    【讨论】:

    • 这里的“适当地”是什么意思?我已经用许多不同的文件尝试过,问题似乎都存在于所有文件中。
    • 通过适当关闭我的意思是完全关闭:) 我没有时间分析你的代码,所以我假设文件根本没有关闭。
    猜你喜欢
    • 2010-09-12
    • 2014-07-11
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多