【问题标题】:Find and append to file without loading it in memory?查找并附加到文件而不将其加载到内存中?
【发布时间】:2015-06-04 10:04:26
【问题描述】:

我正在编写一个简单的用于日志记录的 XML 文件,如下所示:

<root>
 <objects>
 </objects>
</root>

第一次这样创建文件

using (xmlWriter = new XmlTextWriter(filePathAndName, System.Text.Encoding.UTF8))
{
    xmlWriter.Formatting = Formatting.Indented;
    xmlWriter.WriteStartDocument();
    xmlWriter.WriteStartElement("root");
    xmlWriter.WriteStartElement("objects");
    xmlWriter.WriteEndElement();
    xmlWriter.WriteEndElement();
    xmlWriter.WriteEndDocument();
    xmlWriter.Close();
}

现在我需要将对象(字符串格式的序列化数据协定)放在对象标签中而不将其加载到内存中

我找到了很多关于如何执行此操作的建议,但所有建议都将整个文件加载到内存中,当文件很大时,这并不好。

我的想法是这样的:

  1. 用某种阅读器打开文件
  2. 从文件末尾搜索到&lt;/objects&gt;标签
  3. 存储索引并关闭阅读器/文件
  4. 再次打开文件,但这次是作为作家
  5. 将序列化数据合同写入索引(就在
  6. 关闭文件

但我不确定如何在 C# 中正确执行此操作?

【问题讨论】:

  • 这里的文件有多大? (我个人通常会使用 LINQ to XML 而不是 XmlTextWriter,因为它可以使代码更简洁。)您只是害怕加载文件的效率低下,还是您知道这绝对不是一种选择?跨度>
  • 我通常建议不要使用 XML 进行日志记录,正是因为您不能简单地附加每个新条目,而是必须在每次创建新条目时覆盖现有文件的一部分。有什么理由不能是更简单的格式,然后在需要 XML 时转换为 XML?
  • 可以拆分成multiple files吗?
  • @JonSkeet 记录到文件的方法是通用的,并且被应用程序的多个部分使用。此方法将序列化对象作为字符串,然后将路径和文件名保存到。如果文件已经存在,它会检查大小,如果没问题,它会追加。一个文件不会大于 100 MB,但可能同时有多个不同的文件。因此,每次我需要添加事件时将整个文件读入内存感觉不对。我看不出 Linq to XML 对我有什么帮助,它只是根据我所知道的操作 XML 的另一种方式?
  • @Damien_The_Unbeliever XML 有几个很好的特性,它可以简单地反序列化为对象,无需特殊工具即可轻松检查,只需将其拖到网络浏览器即可固定格式。我不明白为什么它不利于记录? WCF 不是使用 XML 进行日志记录吗?我的想法(见主帖)看起来很简单,但很难找到有关如何执行此操作的信息。我用 C++ 手动处理文件,在这些地方很容易找到,在特定的地方,C# 似乎更复杂?

标签: c# .net file io stream


【解决方案1】:

在这种情况下,我的解决方案是 XML 包含技术,它并不完美,但登录要简单得多。我可以使用 appendToFile 而不是操作或读入内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2016-12-31
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多