锁定文件以进行写入/删除,同时允许任何进程读取

时间:2010-07-19 07:13:49

标签: c# .net file-io

我正在使用C#(.NET)开发一个应用程序,并且在处理文件锁定时遇到问题。

  • 我的主要应用程序(A)需要对某个文件进行读/写访问。
  • 单独的应用程序(B)需要对同一文件的读访问权。
  • 我需要阻止用户在我的应用程序(A)运行时编辑或删除文件。应用程序(A)是长期运行的。在(A)运行时,不得删除该文件,即使没有主动读取或写入该文件也是如此。

我完全控制了(A)和(B)的来源,所以我可以修改其中任何一个。

如何在应用程序(A)运行时阻止用户修改/删除文件,同时允许应用程序(A)读/写,应用程序(B)读取?

4 个答案:

答案 0 :(得分:16)

使用FileShare.Read仅允许从其他应用程序读取。您可以通过在应用程序A运行时打开流来锁定文件。处理NonClosingStreamWrapper时,您需要StreamWriter来避免处理流(这会自动发生using

Jon Skeet

NonClosingStreamWrapper可以在here

找到

实施例

当应用程序启动时,使用它来锁定文件

FileStream fileStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);

写入文件时使用

using (StreamWriter sr = new StreamWriter(new NonClosingStreamWrapper(fileStream)))
{
    // File writing as usual
}

当应用程序结束时,使用它来释放文件

fileStream.Close();

答案 1 :(得分:2)

大多数情况下,锁定文件不是为了阻止用户删除文件,而是通知用户运行该应用程序的另一个实例,该文件被另一个用户“使用”。如果多个用户将文件打开到共享文件夹,这将特别有用。 在这种情况下,使用在Appication(A)打开文件时生成的“锁定文件”将更容易,而不是在文件系统级别锁定文件。因此,任何其他应用程序都会注意到存在锁定文件(您可以使用相同的文件名但不同的扩展名来命名),并且还可以在锁定文件中写入谁以及何时获得锁定。应用程序(B)现在可以响应用户...“文件似乎正在被用户xxx从机器yyy修改,你真的想要加载吗?”

当然,应用程序必须在应用程序文件不再使用或应用程序终止时删除锁定文件。在“不幸”的情况下,崩溃会导致锁定文件系统,用户只能对警告请求作出回应,或者可以手动将其删除以释放锁定。

希望这有帮助,

Paolo Marani

答案 2 :(得分:0)

如果您只想锁定文件,以防止写入或删除,但您不想更改文件。

我使用它来锁定我稍后使用的zip文件,因此可以被其他人阅读,但不能更改或更改。 如果我使用@Cloudanger的答案,我就无法在其他进程中读取zip文件。

FileStream fileStreamSslFile = new FileStream(zipFile, FileMode.OpenOrCreate, 
FileAccess.Read, FileShare.Read);

答案 3 :(得分:-1)

虽然我没有使用它,但名为Mutex可以节省你的一天。在应用程序A中打开文件之前,请创建一个如下所示的静音:

Mutex(bool initiallyOwned, string name, out bool createdNew)

将文件名作为第二个参数传递。

现在当您在应用程序B中打开文件时,如果Mutex参数out为false,则再次使用createdNew,然后文件已被A打开,因此您只能阅读它。