【问题标题】:Can reading a continuously appended file cause issues?读取连续附加的文件会导致问题吗?
【发布时间】:2015-04-19 00:28:08
【问题描述】:

我们在另一台服务器上创建了日志文件,并使用以下方法不断附加状态和错误日志:

using (StreamWriter sw = File.AppendText(path))
{
}

这些位于远程 Windows 机器上,我们通常会经历远程连接和通过记事本读取文件的繁琐过程。所以我正在考虑创建一个应用程序来在本地复制文件(使用 File.Copy() 之类的东西)或查看文件的当前快照或逐行(使用 FileInfo(path).OpenText().ReadLine().ReadToEnd() 之类的东西)。

我的问题是,如果我执行任何这些读取操作,是否存在可能导致正在运行的记录器异常的问题或冲突?记录器已集成到主服务应用程序中,我不想因为读取日志文件而使我们的服务崩溃。

【问题讨论】:

  • “数据不足,无法给出有意义的答案” - 艾萨克·阿西莫夫。将需要更多代码,尤其是关于您打算如何阅读日志的代码
  • 感谢您提供令人耳目一新的参考 :)。我还不知道代码应该走哪条路,所以我希望得到一个能引导我找到它的答案

标签: c# file text stream


【解决方案1】:

理论上应该是“好”,对于“好”的某些含义。

File.AppendText() 返回的StreamWriter 使用FileShare.Read 打开文件,这允许其他进程读取该文件,即使它已打开以进行写入。在轮询结束时,您需要确保使用 FileShare.Write 打开文件,以允许其他进程(例如日志记录进程)打开该文件,即使您已经打开该文件以供阅读。

当然,您可能会时不时地读取部分数据。所以我想这在某种程度上取决于你对“冲突”的定义。 :) 但至少应该可以让它工作而不会导致记录器抛出异常。

【讨论】:

  • 很棒的答案!部分数据完全没问题:)。如果我用我的微不足道的日志抓取应用程序崩溃了服务,只是不希望我的同事解决我
  • @Tyress: 明确一点:缺少代码示例,我无法验证是否 100% 确定一切都完全按照假设实现。就像应该测试任何新代码一样,您当然应该针对服务的离线版本测试您的“小日志抓取应用程序”,以确保它按预期工作。不希望任何人被对付。 :)
猜你喜欢
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
相关资源
最近更新 更多