系统相关
首页 > 系统相关> > c#-System.IO.IOException:该进程无法访问文件,因为它正在被另一个进程使用

c#-System.IO.IOException:该进程无法访问文件,因为它正在被另一个进程使用

作者:互联网

我正在使用FileSystemWatcher监视日志文件中的更改.

日志文件由第三方应用程序编写.

触发更改后,我尝试使用以下方法读取文件:

using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, 
    FileAccess.Read, FileShare.ReadWrite))
{
    StreamReader sr = new StreamReader(fs);
    string s = sr.ReadLine();
}

有时它在使用线上失败.

其他时候,它在sr.ReadLine()上失败了,我认为这是因为第三方系统当前正在访问文件.

我认为通过设置FileAccess.Read我应该能够始终读取文件吗?

我如何确保这不会导致异常,或者我只需要四处循环直到可以成功阅读?

解决方法:

简短答案:在阅读之前尝试Thread.Sleep(100),然后尽可能快地阅读.

I thought that by setting the FileAccess.Read I should be able to always read the file?

通过设置FileAccess.Read,您只是在说您需要从文件中读取.通过设置FileShare.ReadWrite,您表示您对在读取文件时进行第三方读取和写入文件感到满意.此例外表示第三方在书写时不习惯阅读.您的第一个选择是检查是否可以配置第三方程序以允许其他进程在写入时进行读取,但是要注意,从正在写入的文件中进行读取可能很麻烦.

How can I make sure that this doesn’t cause an exception, or do I need to just loop around until I can successfully read?

只要第三方要求独占锁定,您就不会遇到例外情况,它有no way to guarantee,但是您可以采取一些减少冲突风险的步骤,主要是:

>他们不写作时阅读
>快速阅读

当他们不写时阅读

现在,您正在监视文件并在第三方写入后立即读取.当您尝试阅读时,它们很可能仍在书写,因此您应该稍等片刻.在阅读之前我会尝试Thread.Sleep 100 ms,但这取决于第三方进程的性质.即如果它每小时刷新一次日志,那么您可以等待更多,但是如果它每秒写入一次,则您等待的时间更少.

快速阅读

有关如何快速阅读的提示,请参见this question.还请记住,现在您正在重复读取完整的文件.如果附件很大,则可以选择缓存已读取的零件,然后缓存Seek下次读取的最后一个已知位置.这样,您将只跳过之前阅读的内容.

标签:streamreader,filesystemwatcher,ioexception,filestream,c
来源: https://codeday.me/bug/20191123/2063814.html