【问题标题】:text append to existing file文本追加到现有文件
【发布时间】:2013-02-07 12:25:15
【问题描述】:
<namespace>
<root>
<node1>
<element 1>
<element 1>
</node1>
<node2>
<element 1>
<element 1>
</node2>
</root>

string stringContains = string.Empty;
                foreach(string line in File.ReadLines(Path))
                {
                    if(line.Contains("<Root>"))
                    {
                        stringContains = line.Replace("<Root>", "<Root>" + newelement.OuterXml);
                    }
                }
File.AppendAllText(Path, stringContains);

我必须用其他节点替换root, 所以我要附加文本。但是,上面的代码在现有文本中附加了stringContains

【问题讨论】:

  • 看起来像一个 XML 文档。为什么不使用 .Net 中内置的适当 XML 解析器并以这种方式操作文档?
  • 您应该考虑使用 Xsl 转换而不是文本解析来执行此任务。
  • 我的文件以 GB 为单位,所以我不想在 xmlDocumnet 中加载文件以解决性能问题,这就是为什么.....我在逐行检查根节点,然后用新的替换根节点节点并附加到现有文件.....thts 我的场景..
  • 使用 json。速度挺快的,
  • 如何在窗体应用程序中...

标签: c# winforms file-io


【解决方案1】:

试试这个。

string stringContains = string.Empty;
var lines = File.ReadLines(Path);
foreach (var line in lines)
{
    if(line.Contains("<Root>"))
    {
        stringContains = line.Replace("<Root>", "<Root>" + newelement.OuterXml);
    }
}
File.WriteAllLines(Path, lines);

但如果您的文件很大,那么这是不好的做法。

【讨论】:

  • 所以解决方案是什么,因为它从我的文件中读取了所有行
【解决方案2】:

注意:不能只更改文件中的一行,需要读取所有内容,更改所需部分并重新写入所有内容。

根据您有关文件大小(GB 长)的信息,您实现所需行为的唯一方法是创建新文件并写入初始文件的内容,仅更改您需要的行。

应逐行处理(如您在示例中所示)以实现内存使用最少

但是,这种方法需要 2X 空间在您的硬盘上直到操作完成(假设您将在完成后删除初始文件)

关于细节:this question 提供了如何实现所描述方法的完整示例

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2018-04-08
    • 1970-01-01
    相关资源
    最近更新 更多