2

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

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

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

4

3 回答 3

5

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

于 2010-02-20T01:30:54.427 回答
2

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

为确保文件被释放,请确保在FileStream完成后关闭文件。为了确保即使您的应用程序崩溃也关闭它,您不需要做任何特定的事情 - 如果您的应用程序崩溃,它的进程将终止并且锁将被释放。

于 2010-02-20T01:39:52.767 回答
2

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

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

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

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

于 2010-02-20T13:28:47.237 回答