C# 将TextWriter与StreamWriter一起使用并同时进行读/写
正如标题所示,我试图同时读取和写入文件。我已经研究过这个话题,但我发现的答案似乎不适合我,因为我的课程环境。我使用多个FileSystemWatcher来跟踪大量文件,这些文件在我的网络中不断通过流。当文件通过my flow的每个部分时,将更新一个文本文件(流中每个点一个文本文件),该文件将标记文件的名称以及在文件夹中创建文件的时间。文件何时通过以及何时写入跟踪器文本文件是不可预测的。我的目标是能够同时读取和写入文件,以防用户试图同时读取正在写入的文本文件。我将如何做到这一点C# 将TextWriter与StreamWriter一起使用并同时进行读/写,c#,stream,streamwriter,filesystemwatcher,C#,Stream,Streamwriter,Filesystemwatcher,正如标题所示,我试图同时读取和写入文件。我已经研究过这个话题,但我发现的答案似乎不适合我,因为我的课程环境。我使用多个FileSystemWatcher来跟踪大量文件,这些文件在我的网络中不断通过流。当文件通过my flow的每个部分时,将更新一个文本文件(流中每个点一个文本文件),该文件将标记文件的名称以及在文件夹中创建文件的时间。文件何时通过以及何时写入跟踪器文本文件是不可预测的。我的目标是能够同时读取和写入文件,以防用户试图同时读取正在写入的文本文件。我将如何做到这一点 //Write t
//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();
}
}
您提到的情况似乎表明,虽然在给定时间可以多次尝试读取/写入文件,但您仍然希望确保按照调用读取或写入操作的正确顺序依次执行操作
确保读写操作同步的一个简单方法是在方法周围放置一个锁
或监视器
。请为您的写入方法尝试以下代码:
然后,我将使用非常类似的构造来读取文件
// read the file
private string ReadFile(string path)
{
Monitor.Enter(this._locker);
try
{
// read the file here...
}
finally
{
Monitor.Exit(this._locker);
}
}
监视器
要做的是确保在正在进行的写入
操作完成之前(反之亦然),文件不会被读取。这将确保在读取旧数据时不会获取旧数据,也不会过度写入新数据(尚未读取)。此方法可随时验证文件的完整性。能否在问题中添加负责读取文件的代码?谢谢如果您使用FileStream,您可以锁定部分文件或使用FileShare。无选项这到底是如何工作的?如果我理解它“锁定”文件,直到可以读/写?在读卡器中,我还会使用一个简单的文件流读卡器吗?@marshallalessi它实际上只是在对象上加了一个锁。因此,在执行WriteFile
时,无法执行方法ReadFile
。实际上,您正在阻塞\u locker
对象。因此,换句话说,在给定的时间内,只有一个线程可以通过监视器
,直到忙碌的线程到达监视器.Exit()
并愿意放弃锁。这有意义吗?谢谢你的解释和回答!不过我还有一个问题,我刚刚测试了这个方法,奇怪的是,它现在每个新文件生成四行数据。也就是说,当它写入文本文件时,它会将同一行复制4次。这可能是什么原因造成的?哇,我希望我没有强迫你接受这个答案。哈哈。如果你选择一个不同的答案,我不会感到难过!好的,为此,我可能需要查看实际读取文件的代码。你能贴出来吗?没有压力,我接受了。我最初有一个简单的streamreader行到ReadAllLines,但是为了这个问题我不得不改变它。问题来自作者,每次我发布一个新文件,我看物理文本文件,我看到它写了四行。例如,我在监控文件夹中发布了一个文本文件名cavmsanass_Tracking.txt,通常它会写:1080\Auto\cavmsanass_Tracking.txt 6/19/2016 5:42:16 PM现在它写:1080\Auto\cavmsanass_Tracking.txt 6/19/2016 5:42:16 PM,但重复了四次。
// read the file
private string ReadFile(string path)
{
Monitor.Enter(this._locker);
try
{
// read the file here...
}
finally
{
Monitor.Exit(this._locker);
}
}