C# 在C中为单独的编写器和读取器应用程序共享文件#
我有两个应用程序,一个正在写入文件,另一个读取文件。它是一个日志文件,因此编写器将一直记录到程序停止,而读取器可以随时调用以获取文件的内容 我认为,当编写器使用FileShare.Read打开文件时,读取器将能够访问该文件,但它会产生一个错误,表明该文件正被另一个进程使用 编写器应用程序: FileStream fs=newfilestream(“file.log”,FileMode.Open,FileAccess.Write,FileShare.Read); BinaryWriter=新的BinaryWriter(fs) 读卡器应用程序: BinaryReader=新的BinaryReader(File.OpenRead(“File.log”)C# 在C中为单独的编写器和读取器应用程序共享文件#,c#,fileshare,C#,Fileshare,我有两个应用程序,一个正在写入文件,另一个读取文件。它是一个日志文件,因此编写器将一直记录到程序停止,而读取器可以随时调用以获取文件的内容 我认为,当编写器使用FileShare.Read打开文件时,读取器将能够访问该文件,但它会产生一个错误,表明该文件正被另一个进程使用 编写器应用程序: FileStream fs=newfilestream(“file.log”,FileMode.Open,FileAccess.Write,FileShare.Read); BinaryWriter=新的Bi
如何防止此错误?是否可以在读取文件的同时尝试指定FileShare.Read?不要直接使用File.OpenRead,而是使用具有此权限的FileStream
此外,对于日志记录,您可以使用log4Net或任何其他免费日志记录框架,这些框架可以非常有效地管理日志记录,我们不必管理对文件的写入。要读取锁定的文件,您需要为文件流提供更多标志 代码如下所示
using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read,FileShare.ReadWrite))
{
using (var binary = new BinaryReader(reader))
{
//todo: add your code
binary.Close();
}
reader.Close();
}
这将以读写的共享模式打开文件以进行只读。这可以通过一个小应用程序进行测试。(使用streamreader\write而不是二进制)
我意识到上面的示例非常简单,但事实仍然是“TestWriteLop”从未释放锁
希望这有帮助谢谢。我使用了文件流,它工作了。我不能使用log4Net,因为我需要写二进制文件,并且需要在环形缓冲区中。很高兴它起作用了。如果你觉得这个答案是对的,请接受。谢谢。是的,这很简单,但正是我所需要的。:)问题解决了。:)是否有完整源代码示例的最终解决方案?
static Thread writer,
reader;
static bool abort = false;
static void Main(string[] args)
{
var fs = File.Create("D:\\test.txt");
fs.Dispose();
writer = new Thread(new ThreadStart(testWriteLoop));
reader = new Thread(new ThreadStart(testReadLoop));
writer.Start();
reader.Start();
Console.ReadKey();
abort = true;
}
static void testWriteLoop()
{
using (FileStream fs = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Write, FileShare.Read))
{
using (var writer = new StreamWriter(fs))
{
while (!abort)
{
writer.WriteLine(DateTime.Now.ToString());
writer.Flush();
Thread.Sleep(1000);
}
}
}
}
static void testReadLoop()
{
while (!abort)
{
Thread.Sleep(1000);
using (var reader = new FileStream("d:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var stream = new StreamReader(reader))
{
Console.WriteLine(stream.ReadToEnd());
stream.Close();
}
reader.Close();
}
}
}