我有一部分代码写入文本文件。这是应该写入文件的唯一活动进程,以下是它的完成方式:
try
{
File.AppendAllText(path, '\n' + tmp);
}
catch (Exception)
{
lblError.Text = "Unable to save file";
}
一半的时间都可以正常工作。但有时会抛出一个异常,说该文件正由另一个进程使用。我查找了哪个进程使用该文件及其w3wp.exe
。我已经读过File.AppendAllText
关闭文件一旦完成,所以它应该没问题,就像我已经完成它一样。正确?
修改
要求说明目的,所以这里。这部分代码应该在另一个进程将使用的配置文本文件中附加一行。我100%确定该流程目前尚未运行。
我可能还会补充一点,这是一个asp.net应用程序(来自代码)。因此用户可以从asp页面写入config.txt。
我试过这个:
static readonly object saveLock = new object();
/*
* stuff
*/
protected void saveToConfig(string input)
{
lock(saveLock)
{
File.AppendAllText(path, '\n' + input);
}
}
但我仍然收到IOException错误,说多个进程正在尝试访问该文件。
答案 0 :(得分:3)
您可以使用Palmer创建一些逻辑,如果失败则重复写入:
Retry.On<IoException>().For(TimeSpan.FromSeconds(15)).With(context =>
{
File.AppendAllText(path, '\n' + tmp);
});