【问题标题】:Read file that's already used by another process读取已被另一个进程使用的文件
【发布时间】:2016-08-02 06:45:52
【问题描述】:

我有一个 C# 应用程序尝试读取另一个应用程序正在写入的日志文件。当我尝试读取文件时,我得到 IOException

“进程无法访问文件...因为它正在被 另一个进程。”

到目前为止我尝试使用的方法如下,但没有一个能解决问题

var log = File.ReadAllText(logPath);

var stream = new FileStream(logPath, FileMode.Open);

using (var stream = File.Open(logPath, FileMode.Open))
  {

  }

【问题讨论】:

标签: c# file io


【解决方案1】:

试试这个:

FileStream logFileStream = new FileStream("c:\test.txt", FileMode.Open,   FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);

while (!logFileReader.EndOfStream)
{
    string line = logFileReader.ReadLine();
    // Your code here
}

// Clean up
logFileReader.Close();
logFileStream.Close();

根据 MethodMan 的建议编辑

using(FileStream logFileStream = new FileStream(@"c:\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using(StreamReader logFileReader = new StreamReader(logFileStream))
    {
        string text = logFileReader.ReadToEnd();
        // Your code..
    }
}

【讨论】:

  • 我会将代码包装在一个 using 以处理 FileStream 和 StreamReader 对象的自动处理,这只是一个建议。 "c:\test.txt" 也应该是 @"c:\test.txt" 以避免编译器将单个反斜杠视为转义字符..
  • 您也可以使用 StreamReader 的 ReadToEnd 方法而不是一次读取一行来缩短代码。
【解决方案2】:

如果“另一个应用程序”在创建/打开文件时不使用 Share.Read,则您无能为力。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2017-12-02
    相关资源
    最近更新 更多