打开刚刚关闭的文件

时间:2010-12-21 22:03:44

标签: c#

我正在编写一个操作文本文件的应用程序。我的函数的前半部分读取文本文件,而后半部分写入(可选)同一文件。虽然我在打开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();
        }

    }

3 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:1)

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

获取写入权限是一个完全不同的蜡烛。同样的FileShare.Read 包含FileShare.Write,允许您在其他人正在阅读时该文件。这很麻烦,你从其他人手中抽出垫子,突然提供完全不同的数据。

你所要做的就是找出那些'别人'可能是谁。 SysInternals的Handles实用程序可以告诉你。希望这是你自己的程序,你可以做一些关于那个

答案 2 :(得分:0)

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