【发布时间】: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();
}
现在我需要将对象(字符串格式的序列化数据协定)放在对象标签中而不将其加载到内存中。
我找到了很多关于如何执行此操作的建议,但所有建议都将整个文件加载到内存中,当文件很大时,这并不好。
我的想法是这样的:
- 用某种阅读器打开文件
- 从文件末尾搜索到
</objects>标签 - 存储索引并关闭阅读器/文件
- 再次打开文件,但这次是作为作家
- 将序列化数据合同写入索引(就在
- 关闭文件
但我不确定如何在 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# 似乎更复杂?