Stream Reader进程无法访问文件,因为它正在被另一个进程使用

时间:2014-05-09 07:59:53

标签: c# .net winforms streamreader

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

当前代码:

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

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

3 个答案:

答案 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);
祝你好运 - 希望这有助于其他人(因为这已经有一年了!)。