读取并清空另一个进程正在使用的文件
本文关键字:文件 清空 另一个 进程 读取 | 更新日期: 2023-09-27 18:34:26
我看过许多标题相似的帖子及其建议的答案。但他们还没有解决我的问题。例子是这个,这个和这个。
我有一个文本文件,它总是被Windows服务锁定(它基本上是一个记录器)。我想做的是在我的程序中读取此文件,并且还可以清空其内容。
我们是否有不包括复制文件的工作解决方案?
这是我到目前为止读取文件的代码,当然它目前不起作用。
serviceLogs = new List<string>();
try
{
//Lock Exclusively the file
using (FileStream fileStream = new FileStream(Globals.serviceLogFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader sr = new StreamReader(fileStream))
{
String line;
while ((line = sr.ReadLine()) != null)
serviceLogs.Add(line);
}
}
几种不同的方法:
-
不要在服务和程序之间共享纯文件。
也许管道或插座更适合您的应用程序。
-
减少服务使文件保持打开状态的时间。例如,通过使用
File.AppendAllLines
或File.AppendAllText
。这仍可能导致锁定冲突,但您应该能够通过重试来处理它们。
-
不要从程序中清除文件。让它向服务发送一条消息,然后清除文件。
将此方法更进一步,您甚至不会从程序中读取文件,而是查询服务。
-
更改服务和程序,以便它们使用宽松的共享标志打开文件。
服务和程序都应该使用
FileShare.ReadWrite
。这有冲突操作损坏数据的风险。
如果可以更改服务,我建议添加某种形式的进程间通信,以便客户端程序可以请求数据的副本,并在同一请求或另一个请求中要求服务器清除文件。 我从未使用过WCF,但据我所知,它听起来像是为此类事情设计的。 如果你想要一个第三方的IPC解决方案,我推荐ZeroC的Ice。