当用户打开文件时,如何锁定对文件的访问?

时间:2010-02-20 01:27:37

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

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

那么如何锁定对文件的访问权限?我只是打开一个文件流对象并保留对它的引用吗?我是否继续使用相同的文件流对象进行任何中间保存,而不是为每次保存打开和关闭它们?或者是否有其他方法来锁定对文件的访问?

另外,即使我的应用程序崩溃,如何确保文件已发布?这是实现IDisposable的好例子吗?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

要小心避免“是文件锁定”测试。这无法在网络上可靠地运行,您必须在获得访问权限后保持文件打开。一旦你关闭它,另一个进程可以在一个纳秒之后获得它的访问权。

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