【问题标题】:Open a file that has just been closed打开刚刚关闭的文件
【发布时间】:2010-12-21 22:03:44
【问题描述】:

我正在编写一个操作文本文件的应用程序。我的函数的前半部分读取文本文件,而后半部分写入(可选)同一个文件。虽然我在打开 StreamWriter 对象之前在 StreamReader 对象上调用了.close(),但我仍然得到一个IOException: The process cannot access the file "file.txt" because it is being used by another process.

如何强制我的程序在继续之前释放文件?

public static void manipulateFile(String fileIn, String fileOut,String obj)
    {
        StreamReader sr = new StreamReader(fileIn);
        String line;
        while ((line = sr.ReadLine()) != null)
        {
            //code to split up file into part1, part2, and part3[]
        }
        sr.Close();

        //Write the file
        if (fileOut != null)
        {
            StreamWriter sw = new StreamWriter(fileOut);
            sw.Write(part1 + part2);
            foreach (String s in part3)
            {
                sw.WriteLine(s);
            }
            sw.Close();
        }

    }

【问题讨论】:

  • 显示您的代码。这是您获得特定场景相关帮助的唯一方法。
  • 就在我的脑海中,您是调用了Dispose() 方法,还是将您的StreamReader 包装在using { } 块中?处理它可能会强制释放文件。
  • @Coding Gorilla,你不应该手动调用Dispose,在处理一次性资源时你应该总是使用using块。
  • @Darin 我不同意你永远不应该手动调用它。除非有充分的理由,否则不应手动调用它。例如,如果您已经有一个 try/catch 块(例如该文件可能不存在),则在其周围放置 using 没有意义,只需将 dispose 放在 finally
  • @Darin Dimitrov:为什么会这样?那么,您将如何在另一个上下文中释放资源?在我看来,这样的一般规则(即永远不要显式调用Dispose)毫无意义。

标签: c#


【解决方案1】:

您发布的代码运行良好 - 我没有看到异常。

但是,像这样手动调用 Close() 是个坏主意 - 如果抛出异常,您可能永远不会调用 Close()。你应该使用 finally 块,或者更好:using statement

using (StreamReader sr = new StreamReader(fileIn))
{
    // ...
}

但是您遇到的实际问题可能不是这种方法,而是忘记在using 块中正确关闭文件的一般问题。我建议您检查所有代码库并查找代码中使用IDisposable 对象的所有位置,并检查您是否正确处理它们即使可能存在异常

【讨论】:

  • +1 建议在处理 StreamReaders 等一次性资源时使用 using 语句。
  • 原来文件正在以另一种方法编辑并且没有关闭。改变我所有的作者和读者以使用 Using 语句就可以了。
【解决方案2】:

获得对已在其他地方打开的文件的读取权限通常并不困难。大多数代码会使用 FileShare.Read 打开一个文件进行读取,从而也允许其他人读取该文件。例如,StreamReader 就是这样做的。

获得写入权限是完全不同的蜡球。同样的 FileShare.Read not 包含 FileShare.Write,允许您在其他人读取文件时写入文件。这很麻烦,你把垫子从别人下面拉出来,突然提供完全不同的数据。

您所要做的就是找出“其他人”可能是谁。 SysInternals 的 Handles 实用程序可以告诉您。希望这是您自己的程序,您可以对那个做点什么。

【讨论】:

    【解决方案3】:

    听起来可能是个愚蠢的问题,但您确定您没有使用另一个应用程序编辑该文件,而该应用程序没有释放该文件?我以前也遇到过这种情况,主要是 Excel 文件没有完全从内存中卸载(或者我只是愚蠢到有时不会关闭其他应用程序)。可能会发生在您用于 .txt 文件的任何应用程序中(如果有)。只是一个建议。

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 2021-04-09
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多