当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在C#中,如果2个进程正在读取和写入同一个文件,那么避免进程锁定异常的最佳方法是什么?》经验,为你挑选了2个好方法。

使用以下文件读取代码:

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

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

该进程无法访问文件'c:\ temp\myfile.txt',因为它正由另一个进程使用.

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

请注意,阅读器进程使用FileSystemWatcher来了解文件何时更改.

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



1> Jeff Yates..:

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

例如,

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.
}

如果您想确保读者始终读取最新文件,您将需要使用一个锁定文件来指示某人正在写入该文件(尽管如果不仔细实施,您可能会遇到竞争条件)或制作确保在打开读取和处理异常时阻止写入共享,因此您可以再次尝试直到获得独占访问权限.


那是真的,是的.如果允许多个使用者访问该文件,情况总是如此.实现此目的和同步的唯一方法是使用锁定文件,或者捕获访问异常并再次尝试,直到您获得独占访问权限.

2> Mitchel Sell..:

如果创建了一个已命名的Mutex,则可以在编写应用程序中定义互斥锁,并使读取应用程序等到释放互斥锁.

因此,在当前使用FileSystemWatcher的通知过程中,只需检查是否需要等待互斥锁,如果这样做,它将等待,然后进行处理.

这是我发现的类似Mutex的VB示例,它应该很容易转换为C#.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有