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

本文关键字:文件 清空 另一个 进程 读取 | 更新日期: 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);
        }
    }

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

几种不同的方法:

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

    也许管道或插座更适合您的应用程序。

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

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

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

    将此方法更进一步,您甚至不会从程序中读取文件,而是查询服务。

  4. 更改服务和程序,以便它们使用宽松的共享标志打开文件。

    服务和程序都应该使用 FileShare.ReadWrite 。这有冲突操作损坏数据的风险。

如果可以更改服务,我建议添加某种形式的进程间通信,以便客户端程序可以请求数据的副本,并在同一请求或另一个请求中要求服务器清除文件。 我从未使用过WCF,但据我所知,它听起来像是为此类事情设计的。 如果你想要一个第三方的IPC解决方案,我推荐ZeroC的Ice。