gpt4 book ai didi

c# - 系统.IO.IOException : The process cannot access the file because it is being used by another process

转载 作者:行者123 更新时间:2023-11-30 16:16:42 24 4
gpt4 key购买 nike

我正在使用 FileSystemWatcher 来监视日志文件的更改。

日志文件由第 3 方应用程序写入。

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

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

有时它会在 using 行失败。

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

我认为通过设置 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,您表示您对第 3 方在阅读文件时读写文件感到满意。 exception 意味着第 3 方不喜欢你在他们写的时候读。您的第一个赌注是检查您是否可以配置第 3 方进程以允许其他进程在写入时读取,但请注意,从正在写入的文件中读取可能很麻烦。

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?

只要第3方需要独占锁就有no way to guarantee你不会得到异常(exception),但你可以采取一些措施来减少冲突的风险,主要是:

  • 当他们不写的时候阅读
  • 快速阅读

在他们不写的时候阅读

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

快速阅读

参见 this question有关如何快速阅读的提示。还要记住,现在您正在反复阅读完整的文件。如果它是一个大的附加文件,您可以选择缓存您已经阅读的部分和 Seek下次读取的最后已知位置。这样您就可以跳过之前阅读过的内容。

关于c# - 系统.IO.IOException : The process cannot access the file because it is being used by another process,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18021662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com