【问题标题】:Read and empty the file that is being used by another process读取并清空另一个进程正在使用的文件
【发布时间】:2015-02-16 05:21:12
【问题描述】:

我查看了许多标题相似的帖子及其建议的答案。但是他们还没有解决我的问题。例如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);
        }
    }

【问题讨论】:

  • 可以修改服务吗?
  • 为什么要打开同一个文件两次?一次使用File.Open(不使用结果)一次通过FileStream 构造函数?
  • @CodesInChaos 是的,我自己编写了服务的更好部分。我可以停止服务,从文件中读取并编辑它,然后重新启动它,但这是一个非常糟糕的主意。由于我的服务有更重要的事情要做以停止自身,因此用户读取其日志文件。
  • @CodesInChaos 哦,是的。抱歉,我将删除该行。
  • 我的意思是,您需要在服务和程序上都使用适当的共享标志。您需要修改服务,以便它打开允许程序读写访问的文件。

标签: c# io text-files streamreader


【解决方案1】:

几种不同的方法:

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

    也许管道或套接字更适合您的应用程序。

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

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

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

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

  4. 同时更改服务和程序,以便它们使用许可共享标志打开文件。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2016-08-02
      • 1970-01-01
      相关资源
      最近更新 更多