我查看了许多帖子,这些帖子具有相似的标题和建议的答案。但他们还没有解决我的问题。示例包括this,this和this。
我有一个文本文件总是被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);
}
}
答案 0 :(得分:1)
一些不同的方法:
不要在服务和程序之间共享纯文件。
管道或插座可能更适合您的应用。
减少服务保持文件打开的时间。例如,使用File.AppendAllLines
或File.AppendAllText
。
这仍然会导致锁定冲突,但您应该可以通过重试来处理它们。
不要清除程序中的文件。让它向服务发送消息,然后清除文件。
进一步采用这种方法,你甚至不会从程序中读取文件,而是查询服务。
更改服务和程序,以便用允许的共享标志打开文件。
服务和程序都应使用FileShare.ReadWrite
。这可能会导致操作冲突,从而破坏数据。
答案 1 :(得分:1)
如果您可以更改服务,我建议添加某种形式的进程间通信,客户端程序可以请求数据的副本,并在同一请求或其他请求中请求服务器清除该文件。我从来没有使用过WCF,但是我知道的很少,听起来它就是为这类东西设计的。如果您需要IPC的第三方解决方案,我建议Ice from ZeroC。