正如标题所示,我试图同时读取和写入文件。我已经研究了这个主题,但由于我的课程环境,我找到的答案似乎并不适合我。我正在使用多个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();
}
}
答案 0 :(得分:2)
确保读取和写入操作同步的一种简单方法是在方法周围放置lock
或Monitor
。请为 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
(反之亦然)。这将确保您在阅读时不会获得旧数据,并且您也不会覆盖新数据(尚未读取)。此方法始终验证文件的完整性。