代码之家  ›  专栏  ›  技术社区  ›  Matthew King

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

  •  12
  • Matthew King  · 技术社区  · 15 年前

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

    • 我需要防止用户在我的应用程序(A)运行时编辑或删除文件。应用程序(A)是长期运行的。在(A)运行时,不能删除该文件,即使该文件不是主动读取或写入的。

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

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

    4 回复  |  直到 15 年前
        1
  •  19
  •   Bertrand Le Roy    4 年前

    使用 FileShare.Read NonClosingStreamWrapper 为了避免在处理文件时处理流 StreamWriter (这会自动发生在 using

    通过 斯基特 可从以下位置找到 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();
    
        2
  •  2
  •   user2991288    10 年前

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

    当然,当应用程序文件不再使用或应用程序终止时,应用程序必须删除锁定文件。在“不幸”的情况下,崩溃会将锁留在文件系统上,用户可以只对警告请求响应yes,也可以手动删除它以释放锁。

    保罗·马拉尼

        3
  •  0
  •   Michael van der Horst    7 年前

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

    FileStream fileStreamSslFile = new FileStream(zipFile, FileMode.OpenOrCreate, 
    FileAccess.Read, FileShare.Read);
    
        4
  •  -1
  •   TheVillageIdiot    15 年前

    Mutex 可以拯救你的一天。在应用程序中打开文件之前,请创建如下mutext:

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

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

    现在,当您在应用程序B中打开一个文件时,再次使用 out 参数 createdNew 如果为false,则文件已由打开,因此您只能读取它。