【问题标题】:StreamWriter/StreamReader File In Use By Another Process另一个进程正在使用 StreamWriter/StreamReader 文件
【发布时间】:2013-01-05 15:37:03
【问题描述】:

我有一个 StreamWriter 对象要写入日志文件,它的初始化如下:

StreamWriter streamWriter = File.AppendText(GetLogFilePath());
streamWriter.AutoFlush = true;

稍后在我的代码中,我需要关闭日志文件,然后读取部分已注销的内容。我有以下代码:

streamWriter.Close();
streamWriter = null;
StreamReader logFileStream = File.OpenText(GetLogFilePath());

这是抛出异常: 该进程无法访问该文件,因为它正被另一个进程使用。

想必问题是我关闭StreamWriter时日志文件没有正确关闭。

有没有更好的方法来关闭 StreamWriter 以确保它打开的文件被正确关闭?

更新:我已经解决了我的问题。这是由一个不相关的问题引起的(一个单独的应用程序正在访问我试图访问的文件)。 我接受了 Dmitry Martovoi 的回答,因为我认为这对将来遇到类似问题的其他人最有用;但重要的一点是,该解决方案确实需要在每次写入日志时都打开日志文件,这可能会导致不必要的开销。

【问题讨论】:

  • 我无法重现此异常。你能粘贴更多代码吗?

标签: c# streamreader streamwriter


【解决方案1】:

我总是将此类代码包装在 using 语句中

using (StreamWriter writer = File.AppendText(path)) 
{
   writer.WriteLine("This");
   writer.WriteLine("is Extra");
   writer.WriteLine("Text");
}

但对于StreamWriter Close 方法的作用与Dispose 完全相同。

【讨论】:

  • 问题在于,每次写入日志时都必须打开文件。就我而言,这占用了太多时间。
【解决方案2】:

您应该将每个文件操作包装在 using 块中:

using (StreamWriter s = new StreamWriter(/* your arguments here *\)) {
    // code that uses it here
}
// file is closed here

【讨论】:

  • 问题在于,每次写入日志时都必须打开文件。就我而言,这占用了太多时间。
【解决方案3】:

尝试使用 File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None);

【讨论】:

    最近更新 更多