C# 流读取器进程无法访问文件,因为其他进程正在使用该文件

C# 流读取器进程无法访问文件,因为其他进程正在使用该文件,c#,.net,winforms,streamreader,C#,.net,Winforms,Streamreader,我的应用程序解析日志文件,但在尝试解析当天的文件时,我收到一个错误,指出该文件正被另一个进程使用。此日志文件当前正在写入,可以通过记事本访问,但不能通过我的应用程序访问 当前代码: Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read); StreamReader sr = new StreamReader(stream); 也尝试过这个,但没有成功: Stream stream = new File

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

当前代码:

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);
要读取另一个进程正在使用的文件,需要对代码进行哪些更改。由于日志的大小和我的应用程序的性能,复制日志文件不是一个解决方案

我们可以使用a打开文件流并对其他进程进行读/写访问:

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

确定此进程打开同一文件时其他进程如何访问同一文件

您的第一个代码块将默认为
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);

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

看这个了吗?你有没有看过接受文件共享(一个决定进程如何共享文件的常量)的重载构造函数?我尝试过:Stream Stream=new FileStream(fileToRead,FileMode.Open,FileAccess.Read,FileShare.Read);但是如果文件正被另一个进程写入,则需要指定(至少)
FileShare.Write
FileShare
表示您对其他用户对该文件所做的操作感到高兴。当然,如果其他进程在打开文件时未指定(相当于)
FileShare.Read
,则此操作仍将失败。您说过记事本可以很好地打开文件,但您的代码不能。用于检查代码和记事本打开文件的不同方式,并将这些信息添加到您的问题中(如果您不知道如何修复代码,使其与记事本的操作方式相同),我尝试了FileShare.Read、FileShare.Write和FileShare.ReadWrite,但没有成功。还有其他建议吗?如前所述,您需要日志编写器使用FileShare.Read打开文件流;检查日志编写器代码,确定创建新日志文件时是否使用FileShare.Read。我的程序不会写入/创建我无法访问的日志文件。我公司的一个网站正在给它写信。我没有访问该代码的权限。当心一个错误:我得到了相同的错误;经过长时间的研究,其原因是,随后打开具有较少文件共享访问权限的文件会导致异常。(在我的例子中,该文件首先使用
FileShare.ReadWrite以
FileStream
的形式打开,然后使用(var stream=file.OpenRead(file))
的形式再次打开,它没有选项,但很可能将其设置为
None
)我尝试了上面的代码,但我使用的不是StreamWriter,而是StreamReader,因为我尝试读取文件而不是写入文件。我仍然无法访问file@SlopTonio,请参阅我的更新正如我之前评论的那样,我尝试了,但仍然无法访问该文件。这很奇怪,因为记事本可以打开日志文件,但我的应用程序却不能
File.SetAttributes(outputDirectory + fileName + ".txt", FileAttributes.ReadOnly);