进程无法访问该文件,因为在写入日志文件时,另一个进程正在访问该文件

时间:2010-11-18 08:06:37

标签: .net

虽然这可能是一个非常着名的问题,但是在所有实现锁定之后我得到了这个例外,而另一个需要。但我有时会得到例外,但无法弄清楚发生了什么。

我正在做的是,在我的应用程序中,我以这种方式将一些日志消息写入文本文件。

WriteToFile(DateTime.Now +“Method1():已输入”,LOG_FILE_NAME);

WriteToFile的定义是这样的:

public void WriteToFile(string message,string fileName)
{
    try
    {
        lock (filelock)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
            {

                // Create the writer for data.
                using (BinaryWriter w = new BinaryWriter(fs))
                {
                    // Write data to Test.data.
                    w.Write(System.Environment.NewLine);
                    w.Write(message);
                    w.Write(System.Environment.NewLine);
                }
            }
        }              
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {

    }
}

每当这个异常到来时,它都会向调用者抛出异常,我再次写入该文件。就像这样:

public void Method1()
{
    try
    {
        WriteToFile(DateTime.Now + "Method1(): Entered", LOG_FILE_NAME);
    }
    catch(Exception ex)
    {
        WriteToFile(DateTime.Now + "Exception in Method1():"+ex.Message, LOG_FILE_NAME);
    }
}

但是现在在Method1()中,捕获的异常能够写入文件。

所以,我在这里寻求任何人的帮助。还有其他更好的方式在这里做日志记录吗?

谢谢& Regads

帕德玛

3 个答案:

答案 0 :(得分:1)

如果这是您的“真实世界”问题(日志记录),您应该使用经过良好测试,工作且可扩展的解决方案进行日志记录 - > microsoft enterprise liblog4net。否则请添加更多/所有有关您尝试的内容的详细信息。

答案 1 :(得分:0)

MSDN says“我的功能为您提供了比锁定和解锁更高的文件I / O操作效率和性能”。

这意味着您可以使用my.Computer.FileSystem.WriteAllText()代替。我个人会创建一个streamwriter对象:

    public void WriteToFile(string message, string fileName)
    {
        System.IO.StreamWriter fstream;
        fstream = new System.IO.StreamWriter(fileName,true);
        // stream writer adds newline to the end for you
        fstream.WriteLine(message);
        // flush to send all buffered data to the file
        fstream.Flush();
        // close the file, free resources
        fstream.Close();
    }

另外我相信你需要在写入文件后解锁文件,否则它可能会保持锁定状态。第三,您是否有锁定日志文件的具体原因?就像你在同一时间从多个进程写入它一样?如果没有,那么我不明白为什么你需要先把它锁起来。

答案 2 :(得分:0)

您正在寻找这样的东西吗? :)

public void WriteToFile(string message,string fileName)
{
    try
    {
        StreamWriter w = File.AppendText(filename)
        w.WriteLine(message);
        w.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}