如何读取正在使用的文件?

54

我有一个小问题。我有一个工具,应该每天解析一个日志文件,但不幸的是,这个日志文件正在被写入日志的进程使用,因此我无法停止它。

第一次尝试是创建文件的副本,然而这也行不通。

是否有任何方法可以让我读取当前正在使用的日志文件的文本内容呢?


1
你尝试过怎样读取它? - jgauffin
1
取决于工具打开日志文件的方式。如果它很好并使用FILE_SHARE_READ,您可以像其他帖子建议的那样打开日志文件进行读取;否则就很遗憾了。 - Anton Tykhyy
5个回答

125
using (FileStream stream = File.Open("path to file", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader reader = new StreamReader(stream))
    {
        while (!reader.EndOfStream)
        {

        }
    }
}

FileAccess指定了您想对文件执行的操作。 FileShare指定了在您使用文件时其他人可以对文件执行的操作。

在上面的例子中,您可以打开一个文件进行读取,而其他进程可以打开该文件以获得读/写访问权限。在大多数情况下,这适用于打开正在使用的日志文件。


2
+1,这里的唯一正确答案。指定FileShare.ReadWrite至关重要。另一个进程已经获得了写入权限,你无法拒绝它。 - Hans Passant
File.OpenRead 在其中执行此操作。 - Jan Jongboom
1
不是这样的。使用反射查看一下:return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); - Tom Vervoort
1
是的,File.OpenRead 对我没有起作用。 - Core_F
2
给我相同的“文件正在使用”错误。 - MichaelvdNet

2

你将取决于编写文件的程序。在Windows中,进程可以打开文件进行读取、写入或两者兼备,但它还可以控制其他进程是否可以打开文件进行读取、写入或两者兼备。如果其他进程拒绝了你读取文件内容的权利,那么你就无能为力。

如果你控制编写日志文件的程序的源代码,则更改它以允许其他进程读取访问。


所以我们无法改变这种行为。还有其他方法可以以某种方式读取吗? - Furkan Gözükara

1
使用 File.OpenRead(path),这样可以让您访问文件的只读流;这样您就不会受到另一个应用程序对文件施加的写锁的干扰。

3
不总是正确的,我在读取一个被锁定的日志文件时遇到了麻烦,我正在使用File.OpenRead。 - Paul Brindley
1
当另一个应用程序已经以写入模式打开文件时,File.OpenRead将无法打开该文件。Tom Vervoort的答案是正确的。 - Wout

0

这要看情况,你尝试过以只读方式读取文件吗?可以使用其中的一个静态方法。

 System.IO.File.ReadAllText(path) or  System.IO.File.ReadAllLines(path)

如果文件没有被独占锁定,它们可能会起作用。


1
当文件正在被写入时,这会抛出异常。 - Nitin Sawant

-4

我强烈推荐BareTail,我们使用它来实时查看所有日志。还支持高亮显示,非常有用。


1
嗯...看起来OP想要一种编程方式来读取已经打开的文件。=P - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接