将TextWriter与StreamWriter同时使用和读/写

时间:2016-06-19 23:22:48

标签: c# stream streamwriter filesystemwatcher

正如标题所示,我试图同时读取和写入文件。我已经研究了这个主题,但由于我的课程环境,我找到的答案似乎并不适合我。我正在使用多个FileSystemWatchers来跟踪大量不断通过网络流量的文件。当文件通过我的流程的每个部分时,将更新文本文件(流程中每个点的一个文本文件),该文件标记文件的名称以及在文件夹中创建的时间。当文件可能通过时,以及它们可能正在写入跟踪器文本文件时,这是不可预测的。我的目标是能够同时读取和写入文件,以防用户尝试从同一时间写入的文本文件中读取。我该如何做到这一点?

//Write to File
    private void WriteToFile(string info,string path,string tr)
    {
        if (!File.Exists(path+@"\"+@tr))
        {
            var myFile =
            File.Create(path + @"\" + @tr);
            myFile.Close();
            TextWriter tw = new StreamWriter(path + @"\" + @tr, true);
            tw.WriteLine(info,true);
            tw.Close();
        }
        else if (File.Exists(path + @"\" + @tr))
        {
            TextWriter tw = new StreamWriter(path + @"\" + @tr, true);
            tw.WriteLine(info);
            tw.Close();
        }
    }

1 个答案:

答案 0 :(得分:2)

你提到的情况似乎在说,虽然可以在给定时间多次尝试读/写文件,但你仍然希望确保操作一个接一个地执行以正确的顺序调用读或写。

确保读取写入操作同步的一种简单方法是在方法周围放置lockMonitor 。请为 write 方法尝试以下代码:

private readonly object _locker = new object();

// write the file
private void WriteToFile(string info, string path, string tr)
{
    Monitor.Enter(this._locker);

    try
    {
        if (!File.Exists(path + @"\" + @tr))
        {
            var myFile =
            File.Create(path + @"\" + @tr);
            myFile.Close();
            TextWriter tw = new StreamWriter(path + @"\" + @tr, true);
            tw.WriteLine(info, true);
            tw.Close();
        }
        else if (File.Exists(path + @"\" + @tr))
        {
            TextWriter tw = new StreamWriter(path + @"\" + @tr, true);
            tw.WriteLine(info);
            tw.Close();
        }
    }
    finally
    {
        Monitor.Exit(this._locker);
    }
}

然后,我会使用一个非常相似的构造来读取文件。

// read the file
private string ReadFile(string path)
{
    Monitor.Enter(this._locker);

    try
    {
        // read the file here...
    }
    finally
    {
        Monitor.Exit(this._locker);
    }
}

Monitor将做的是确保在正在进行的read操作完成之前该文件不会是write(反之亦然)。这将确保您在阅读时不会获得旧数据,并且您也不会覆盖新数据(尚未读取)。此方法始终验证文件的完整性。