Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 锁定文件以进行写入/删除,同时允许任何进程读取_C#_.net_File Io - Fatal编程技术网

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

C# 锁定文件以进行写入/删除,同时允许任何进程读取,c#,.net,file-io,C#,.net,File Io,我正在用C#(.NET)开发一个应用程序,在处理文件锁定方面遇到了问题 我的主应用程序(A)需要对某个文件进行读/写访问 单独的应用程序(B)需要对同一文件进行读取访问 我需要防止用户在我的应用程序(A)运行时编辑或删除文件。应用程序(A)是长期运行的。在(A)运行时,不得删除该文件,即使该文件未被主动读取或写入 我完全控制(A)和(B)的源代码,所以我可以修改它们中的任何一个 如何阻止用户在应用程序(a)运行时修改/删除文件,同时允许应用程序(a)读/写,以及应用程序(B)读?虽然我没有使

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

  • 我的主应用程序(A)需要对某个文件进行读/写访问
  • 单独的应用程序(B)需要对同一文件进行读取访问
  • 我需要防止用户在我的应用程序(A)运行时编辑或删除文件。应用程序(A)是长期运行的。在(A)运行时,不得删除该文件,即使该文件未被主动读取或写入
我完全控制(A)和(B)的源代码,所以我可以修改它们中的任何一个


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

虽然我没有使用它,但名为
互斥锁可以节省时间。在应用程序a中打开文件之前,请按如下方式创建互斥文本:

Mutex(bool initiallyOwned, string name, out bool createdNew)
将文件名作为第二个参数传递


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

使用
FileShare.read
仅允许从其他应用程序读取。您可以在应用程序a运行时打开一个流来锁定文件。您需要一个
NonClosingStreamWrapper
,以避免在处理
StreamWriter
时处理流(使用
时会自动发生此情况)

NonClosingStreamWrapper
byJon Skeet可从

例子 当应用程序启动时,使用此选项锁定文件

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();

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

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

希望这有帮助


Paolo Marani

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

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

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

这将如何防止用户删除文件,例如通过Windows资源管理器删除文件?@jovie如果您以独占方式打开文件,则会妨碍其他进程删除文件,但可能会出现其他问题,例如其他进程甚至无法读取文件。这将只适用于您的两个(或未来)应用程序,并且无法阻止某人使用资源管理器、命令行等删除文件。这解决了我的问题。但是,需要注意的是,当底层流被释放时,StreamWriter将关闭底层流(从而解锁文件),因此您必须解决这个问题。我一直在使用Jon Skeet的MiscUtils中的NonClosingStreamRapper。@Joviee谢谢。现在对答案进行编辑以记录您所说的内容。您是否可以同时使用:锁定文件和锁定文件上的文件系统锁定?如果应用程序锁定锁定文件,并且应用程序崩溃,则该文件将自动解锁。在这种情况下,当应用程序尝试访问锁文件并且成功时,它可以安全地假定它是正常的,因为实际上没有人使用它。