读取并清空另一个进程正在使用的文件

时间:2014-12-17 15:43:06

标签: c# io text-files streamreader

我查看了许多帖子,这些帖子具有相似的标题和建议的答案。但他们还没有解决我的问题。示例包括thisthisthis

我有一个文本文件总是被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);
        }
    }

2 个答案:

答案 0 :(得分:1)

一些不同的方法:

  1. 不要在服务和程序之间共享纯文件。

    管道或插座可能更适合您的应用。

  2. 减少服务保持文件打开的时间。例如,使用File.AppendAllLinesFile.AppendAllText

    这仍然会导致锁定冲突,但您应该可以通过重试来处理它们。

  3. 不要清除程序中的文件。让它向服务发送消息,然后清除文件。

    进一步采用这种方法,你甚至不会从程序中读取文件,而是查询服务。

  4. 更改服务和程序,以便用允许的共享标志打开文件。

    服务和程序都应使用FileShare.ReadWrite。这可能会导致操作冲突,从而破坏数据。

答案 1 :(得分:1)

如果您可以更改服务,我建议添加某种形式的进程间通信,客户端程序可以请求数据的副本,并在同一请求或其他请求中请求服务器清除该文件。我从来没有使用过WCF,但是我知道的很少,听起来它就是为这类东西设计的。如果您需要IPC的第三方解决方案,我建议Ice from ZeroC