c# - 在 C# 中,如果 2 个进程正在读取和写入同一个文件,避免进程锁定异常的最佳方法是什么?

标签 c# file-io distributed

读取文件代码如下:

using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
{
    using (TextReader tr = new StreamReader(fileStream))
    {
        string fileContents = tr.ReadToEnd();
    }
}

并在下面的文件中写入代码:

using (TextWriter tw = new StreamWriter(fileName))
{
    tw.Write(fileContents);
    tw.Close();
}

可以看到以下异常详细信息:

The process cannot access the file 'c:\temp\myfile.txt' because it is being used by another process.

避免这种情况的最佳方法是什么?读者是否需要在收到异常后重试,还是有更好的方法?

请注意,读取器进程正在使用 FileSystemWatcher 来了解文件何时更改。

另请注意,在这种情况下,我不是寻找在两个进程之间共享字符串的替代方法。

最佳答案

您可以打开一个文件进行写入并仅锁定写入访问权限,从而允许其他人仍然读取该文件。

例如,

using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
   // Do your writing here.
}

其他文件访问只是打开文件只读不写,允许读写共享。

using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
   // Does reading  here.
}

如果你想确保读者总是读取最新的文件,你将需要使用一个锁定文件来指示有人正在写入文件(尽管如果不小心实现你可能会出现竞争条件) 或确保在打开读取时阻止写入共享并处理异常,以便您可以重试,直到获得独占访问权限。

关于c# - 在 C# 中,如果 2 个进程正在读取和写入同一个文件,避免进程锁定异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/222089/

相关文章:

java - 解析包含单行和多行数据的文件

java - 具有分布式数据库的Java Web应用程序

c# - C# 泛型有性能优势吗?

c# - 从 linqpad 或控制台应用程序运行 asp.net mvc 应用程序

c - 从文件读取时如何跳过字符串中的空格

python - 修改文件中的一行

distributed-computing - 保持在群组通信服务或paxos中记录消息是否实用?

java - 如何创建一个向客户端分发工作单元的服务器?

c# - 如何使用c#通过USB连接仪器

c# - 封闭式与开放式比较