同时使用 TextWriter 与 StreamWriter 和 Reading/Writing
Using TextWriter with StreamWriter and Reading/Writing Simultaneously
如标题所示,我正在尝试同时读取和写入文件。我已经研究过这个主题,但由于我的程序中的情况,我找到的答案似乎对我不起作用。我正在使用多个 FileSystemWatcher 来跟踪不断通过我的网络中的流的大量文件。当文件通过我的流程的每个部分时,一个文本文件会更新(流程中每个点一个文本文件),标记文件的名称和它在文件夹中的创建时间。文件何时通过以及何时写入跟踪器文本文件是不可预测的。我的目标是能够同时读取和写入文件,以防用户试图读取同时写入的文本文件。我将如何做到这一点?
//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/write,但你仍然希望确保这些操作按照调用读取或写入的正确顺序一个接一个地执行。
确保 read 和 write 操作同步的一个简单方法是将 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
操作完成(反之亦然)。这将确保您在读取时不会得到旧数据,也不会覆盖新数据(尚未读取)。此方法始终验证文件的完整性。
如标题所示,我正在尝试同时读取和写入文件。我已经研究过这个主题,但由于我的程序中的情况,我找到的答案似乎对我不起作用。我正在使用多个 FileSystemWatcher 来跟踪不断通过我的网络中的流的大量文件。当文件通过我的流程的每个部分时,一个文本文件会更新(流程中每个点一个文本文件),标记文件的名称和它在文件夹中的创建时间。文件何时通过以及何时写入跟踪器文本文件是不可预测的。我的目标是能够同时读取和写入文件,以防用户试图读取同时写入的文本文件。我将如何做到这一点?
//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/write,但你仍然希望确保这些操作按照调用读取或写入的正确顺序一个接一个地执行。
确保 read 和 write 操作同步的一个简单方法是将 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
操作完成(反之亦然)。这将确保您在读取时不会得到旧数据,也不会覆盖新数据(尚未读取)。此方法始终验证文件的完整性。