【问题标题】:File still open after File.AppendAllTextFile.AppendAllText 之后文件仍然打开
【发布时间】:2014-09-11 13:54:46
【问题描述】:

我有一部分代码写入文本文件。这是唯一应该写入文件的活动进程,它是如何完成的:

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 错误,说明多个进程正在尝试访问该文件。

【问题讨论】:

  • 你有w3wp.exe 我猜你是在一个多线程环境中(对 IIS 的多个请求)=> 两个线程正在并行访问文件?
  • 好像是这样,是的。我实际上不确定,因为大部分代码不是我的工作^^。如果是这样的话,我想一个简单的锁就足够了?
  • 是的,锁应该有帮助,但我认为存在一个基本的设计缺陷......
  • 好的.. 需要详细说明吗? =)
  • ...那么您需要处理这种情况,因为您无法避免它们->例如制定一些逻辑,如果失败则重复追加...

标签: c# .net ioexception w3wp


【解决方案1】:

您可以使用Palmer 创建一些逻辑,如果失败则重复写入:

Retry.On<IoException>().For(TimeSpan.FromSeconds(15)).With(context =>
    {
        File.AppendAllText(path, '\n' + tmp);
    });

【讨论】:

  • 感谢您的所有帮助 =)
猜你喜欢
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多