【问题标题】:How do I lock access to a file when a user has it open?当用户打开文件时,如何锁定对文件的访问?
【发布时间】:2010-02-20 01:27:37
【问题描述】:

我正在编写一个 C#.NET 程序,它使用 XmlSerializer 对当前用户正在处理的项目与 XML 文件进行序列化和反序列化。这工作正常,但我试图找出一种方法来防止两个用户从网络驱动器打开同一个文件并让一个用户覆盖前一个用户的保存。我基本上想要 MS Word 的行为,如果程序在打开文件时无法获得对文件的写访问权限,它会以只读模式打开文件。

那么如何锁定对文件的访问?我是否只是打开文件流对象并保留对它的引用?我是否继续对任何中间保存使用相同的文件流对象,而不是为每次保存打开和关闭它们?还是有其他方法可以锁定对文件的访问?

此外,即使我的应用程序崩溃,我如何确保文件被释放?这是实现 IDisposable 的好案例吗?

【问题讨论】:

    标签: c# .net file-io idisposable file-access


    【解决方案1】:

    您可以使用FileStream.LockFileStream.Unlock 方法

    【讨论】:

      【解决方案2】:

      您不需要做任何特别的事情来完成这项工作。首先尝试使用 FileAccess.ReadWrite 和 FileShare.Read 打开文件。如果您没有收到 IOException,您将拥有对该文件的独占写入权限。其他进程可以从文件中读取,但永远无法获得写入权限。

      如果打开尝试失败,您可以假设其他人已经打开了文件以供写入。现在将您的内部程序逻辑切换到“只读”模式并使用 FileAccess.Read 和 FileShare.ReadWrite 打开文件。如果这仍然是炸弹,则说明文件存在根本性问题,IOException 会告诉您什么。

      要非常小心避免“文件是否被锁定”测试。这不能在网络上可靠地工作,您必须在获得访问权限后保持文件处于打开状态。一旦你关闭它,另一个进程就可以访问它,一纳秒后。

      这种锁定的另一个典型问题是用户通常想知道谁对文件进行了锁定。 Windows 不提供任何标准的查找方法。 Office 通过在同一目录中创建一个与文件同名但文件扩展名不同的隐藏文件来处理此问题。它将用户名写入此文件,任何发现该文件被锁定的进程都可以使用该名称。你也可以这样做,Environment.UserName 会很好。

      【讨论】:

      • 这种方法适用于多个文件吗?当用于大量文件时,这会降低系统性能吗?
      【解决方案3】:

      如果您使用File.Open 方法打开文件流,请确保使用带有FileShare 参数的重载(this 一个)。您可以将其设置为各种值,以指定流在使用时应如何锁定文件(即允许其他进程读取但不允许写入,防止其他进程使用)。您需要 None 值来防止任何其他进程(或您的进程中的另一个流)访问该文件。

      为确保文件被释放,请确保在完成后关闭FileStream。为确保即使您的应用程序崩溃也关闭它,您无需执行任何特定操作 - 如果您的应用程序崩溃,其进程将终止并释放锁。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多