【发布时间】:2014-01-23 17:59:38
【问题描述】:
我正在尝试在一个类中实现一些基本的配置文件读/写/编辑功能。 配置文件存储在文件 [...]\config.txt 中,该文件存储在“路径”变量中。
我的配置文件的语法如下:
param0 value_of_it
param1 value_of_it
something_else you_get_it
第一个空格的所有内容都是要找到参数的名称,该行的其余部分被认为是该参数的值。
上下文就这么多。 现在,当我尝试使用 file.delete 删除该文件时,我得到:
“System.IO.IOException: 无法访问文件,因为它正被另一个进程使用”。
这里是有问题的代码:
internal void alter(string param, bool replace = false, string value = null) {
//here
string buf;
System.IO.StreamReader reader = new System.IO.StreamReader(path);
string bufPath = path.Substring(0, path.Length-4)+"_buf.txt";
System.IO.StreamWriter writer = new StreamWriter(bufPath);
while((buf = reader.ReadLine()) != null) {
if(buf.Substring(0, param.Length) != param)
writer.WriteLine(buf);
else if(replace)
writer.WriteLine(param+" "+value);
}
writer.Dispose();
reader.Dispose();
writer.Close();
reader.Close();
//there
File.Delete(path);
File.Move(bufPath, path);
}
该函数将原始文件逐行复制到缓冲区中,调用中指定的参数除外。该行要么被忽略,因此被删除,或者在调用时被替换。 然后删除原始文件并将_buf版本“移动”到那里(重命名)。
这些步骤被正确执行(_buf 文件被创建并正确填充)直到抛出异常的“File.Delete(path)”。
我已经尝试注释掉 //here 和 //there 之间的整个部分,只删除文件,这会导致相同的异常,因此问题必须具有更基本的性质。
按照here on ServerFault 的建议,我尝试使用 Sysinternals Process Explorer 查找一个有问题句柄的进程,但找不到任何东西。我在自己的进程中只找到了该文件的三个句柄。 我在杀死 Windows 资源管理器后也运行了该应用程序,因为我读过有时它是违规者;这也没有帮助。
我还检查了整个程序的其余部分并确认了以下内容:
这是第一次使用此文件,因此不可能忘记过去的句柄。
它是一个单线程应用程序(到目前为止),因此也排除了死锁和竞争条件。
所以这是我的问题:我怎样才能找到锁定我的文件的内容? 或者:有没有更简单的方法来删除或编辑文件中的一行?
【问题讨论】:
-
关于使用“使用”:我已经考虑过这一点,一旦解决,可能会应用它。不过现在:即使我使用“使用”语句;如果我不知道是什么锁定了该文件,我将永远无法做我想做的事,无论我是否遇到异常(到目前为止我的方式)或什么都没做('使用'方式) .
-
首先是
Close,然后是Dispose(不是其他情况)。这可能是一个原因。 -
@Sinatr:可悲的是没有帮助。已经离开了整个读/写部分,只是尝试了
File.Delete(path),结果相同:-/ -
您当前的代码在这里可以正常工作,我刚刚尝试过。也许您有记事本或任何其他程序访问该文件,我不确定。无论如何,您有更好的选择来存储配置文件。您可以使用 xml 格式,请参阅我的答案以了解如何使用..
标签: c# text replace file-handling