【问题标题】:Stream Reader process cannot access file because its in use by another process [duplicate]Stream Reader进程无法访问文件,因为它正在被另一个进程使用[重复]
【发布时间】:2014-05-09 07:59:52
【问题描述】:

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

当前代码:

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

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

【问题讨论】:

  • 你有没有看过重载的构造函数,它接受一个 FileShare(一个确定文件将如何被进程共享的常量)
  • 我试过了:Stream stream = new FileStream(fileToRead, FileMode.Open, FileAccess.Read, FileShare.Read);但没有运气
  • 如果文件正被另一个进程写入,您需要指定(至少)FileShare.Write。 FileShare 表示您对其他 用户对文件所做的事情感到高兴。当然,如果其他进程在打开文件时没有指定(相当于)FileShare.Read,这仍然会失败。
  • 您说记事本可以正常打开文件,但您的代码不能。使用Process Monitor 检查您的代码和记事本打开文件的不同方式,并将该信息添加到您的问题中(如果不是,那么,如何修复您的代码以与记事本相同的方式运行对您来说很明显)

标签: c# .net winforms streamreader


【解决方案1】:

我们可以使用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);

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

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

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

【讨论】:

  • 我尝试过 FileShare.Read、FileShare.Write 和 FileShare.ReadWrite,但没有成功。还有其他建议吗?
  • 如前所述,您需要日志写入器使用 FileShare.Read 打开文件流;检查日志写入器代码并确定它是否在创建新日志文件时使用 FileShare.Read。
  • 我的程序没有写入/创建这个我无法访问的日志文件。它正在由我公司的一个网站写入。我无权访问该代码。
  • 小心一个错误:我遇到了同样的错误;经过长时间的研究,原因是随后打开具有较少 FileShare 访问权限的文件会导致异常。 (在我的情况下,文件首先以FileStream 和FileShare.ReadWrite 打开,然后再次以using (var stream = File.OpenRead(file)) 打开,它没有选项,但很可能将其设置为None)
【解决方案2】:

这是一个代码sn-p

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

【讨论】:

  • 我尝试了上面的代码,但我使用的是 StreamReader 而不是 StreamWriter,因为我试图读取文件而不是写入文件。我仍然无法访问该文件
  • @SlopTonio,查看我的更新
  • 正如我之前评论的那样,我尝试过,但仍然无法访问该文件。这很奇怪,因为记事本可以打开日志文件但我的应用程序不能
【解决方案3】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 2015-12-07
    • 2011-04-17
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多