尽管锁定了块,但在写入文本文件时发生IOException

时间:2011-11-24 14:57:43

标签: c# locking ioexception streamwriter appendtext

我知道答案必须在某处,我从许多其他问题和MSDN本身应用了建议,但我可能会在这里忽略一些东西。

这是我的方法,我用它来将输出转储到文件。为了清楚起见,附上了锁定对象声明。

private static Object fileLock = new Object();
private static void WriteToFile(string msg, bool WriteLine)
{
    lock (fileLock)
    {
        msg = DateTime.Now.ToShortTimeString() + " - " + msg;

        FileInfo F = new FileInfo("dump.txt");
        using (StreamWriter writer = F.Exists ? F.AppendText() : F.CreateText()) //<--THIS LINE THROWS
        {
            if (WriteLine)
                writer.WriteLine(msg);
            else
                writer.Write(msg);
        }
    }
}

问题是:为什么上面的using行会引发IOException抱怨另一个进程在我第二次调用该方法时正在使用该文件?

我在我的代码周围这样称呼它:

Console.WriteLine(something)
#if(DEBUG)
    Extensions.WriteToFile(something,true);
#endif

同样,我肯定这是一个微不足道的问题,其他人问这样的事情得到正确的答案,但我无法挖掘它。

更新

重构FileInfo对象并切换到File.XXX方法使代码正常工作。我仍然想知道问题是什么,无论如何问题似乎已经解决了。

1 个答案:

答案 0 :(得分:2)

@Guffa:声明必须是私有静态对象fileLock = new object();

@alex:你的代码在我的机器上运行得很好,虽然它对于任务imo来说有点过于复杂。

static void Write(string text, string file)
    {
        using (StreamWriter sw = File.AppendText(file))// Creates or opens and appends
        {
            sw.WriteLine(text);
        }
    }

也许某些防病毒或索引器会锁定您的转储文件。