流读取器进程无法访问文件,因为它正在被另一个进程使用

本文关键字:进程 另一个 因为 读取 文件 访问 | 更新日期: 2023-09-27 18:02:35

我的应用程序解析日志文件,但是当试图解析当天的文件时,我得到一个错误,指出该文件正在被另一个进程使用。此日志文件当前正在写入,并且可以通过记事本访问,但不能通过我的应用程序访问。

当前代码:

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

为了读取另一个进程正在使用的文件,需要对我的代码进行哪些更改?由于日志的大小和应用程序的性能,复制日志文件不是一个解决方案

流读取器进程无法访问文件,因为它正在被另一个进程使用

我们可以使用不同的签名来打开对其他进程具有读写访问权限的文件流:

Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read,
                        FileShare.ReadWrite);

Stream stream = File.Open(fileToRead, FileMode.Open, FileAccess.Read,
                        FileShare.ReadWrite);

FileShare选项决定当这个进程打开同一个文件时,其他进程如何访问这个文件。

您的第一个代码块将默认为FileShare.None:

Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read);

当文件打开时,因为它试图获得对文件的独占访问权,这会失败。

但是,您需要在日志写入器中执行此操作,以允许日志读取器具有读访问权限。

最后,尝试以管理员身份运行日志阅读器,因为当您"用记事本打开"时,可能存在操作系统权限不明显的情况。

下面是一段代码片段

问题是当另一个应用程序先打开它时,文件共享是只读的(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     
            }
        }

我遇到过一个类似的问题,通过设置文件属性解决了这个问题。

File.SetAttributes(outputDirectory + fileName + ".txt", FileAttributes.Normal);

这是在创建文件之后完成的。这个问题与操作系统如何管理被多个进程访问的文件有关。在我的例子中,我删除了文件(您并不总是被允许这样做,因为您将得到您所看到的错误)。解决这个问题的唯一真正方法是跟踪正在访问文件的进程并阻止它们。我解决这个问题最简单的方法是重新启动我的电脑,但如果你在服务器上工作,这是不可行的。

我还没有做过大量的测试,但是如果你想让它被多个进程使用,也许给文件读取属性和/或属性是一个好主意:

File.SetAttributes(outputDirectory + fileName + ".txt", FileAttributes.ReadOnly);

祝你好运-希望这对其他人有所帮助(因为它已经一岁了!)。