我的应用程序解析日志文件,但在尝试解析当天的文件时,我收到一条错误,指出该文件正由另一个进程使用。此日志文件当前正在写入,可通过记事本访问,但不能通过我的应用程序访问。
当前代码:
Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(stream);
也尝试了这个,但没有运气:
Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
为了读取另一个进程正在使用的文件,需要对我的代码进行哪些更改。由于日志的大小和应用程序的性能,复制日志文件不是解决方案
答案 0 :(得分:6)
我们可以使用different signature打开文件流,并具有对其他进程的读/写访问权限:
Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite);
或
Stream stream = File.Open(fileToRead, FileMode.Open, FileAccess.Read,
FileShare.ReadWrite);
FileShare option确定当此进程打开同一文件时其他进程如何访问同一文件。
您的第一个代码块将默认为FileShare.None
:
Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read);
当文件打开时,这会失败,因为它试图获得对文件的独占访问权。
但是,您需要在日志编写器中进行此操作,以允许您的日志阅读器具有读取权限。
最后,尝试以管理员身份运行您的日志阅读器,因为当您“使用记事本打开”时,可能存在操作系统权限,这些权限并不明显。
答案 1 :(得分:1)
以下是代码段
问题是当另一个应用程序首先打开它并且文件共享是只读(FileShare.Read)时,你肯定无法写入文件但是你可以阅读,或文件共享是只写(FileShare.Write)你无法读取文件但仍然可以写入文件。
using (FileStream file = new FileStream("You File Name here", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
{
using (StreamReader sr = new (StreamReader (file))
{
//Do your codes here
}
}
答案 2 :(得分:1)
我遇到了类似的问题,通过设置文件属性解决了这个问题。
File.SetAttributes(outputDirectory + fileName + ".txt", FileAttributes.Normal);
这是在创建文件后完成的。问题与操作系统如何管理多个进程正在访问的文件有关。在我的情况下,我删除了文件(你并不总是允许这样做,因为你会得到你所看到的错误)。解决此问题的唯一真正方法是跟踪正在访问文件的进程并停止它们。解决这个问题的最简单方法是重启我的电脑,但是如果你在服务器上工作,这是不可行的。
我还没有做过大量的测试,但是如果你想让它被多个进程使用,那么为文件读取属性和/或属性可能是个好主意:
File.SetAttributes(outputDirectory + fileName + ".txt", FileAttributes.ReadOnly);
祝你好运 - 希望这有助于其他人(因为这已经有一年了!)。