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