C# 文本附加到现有文件 string stringContains=string.Empty; foreach(File.ReadLines(路径)中的字符串行) { 如果(第行包含(“”)) { stringContains=line.Replace(“,”+newelement.OuterXml); } } AppendAllText(路径,stringContains);

C# 文本附加到现有文件 string stringContains=string.Empty; foreach(File.ReadLines(路径)中的字符串行) { 如果(第行包含(“”)) { stringContains=line.Replace(“,”+newelement.OuterXml); } } AppendAllText(路径,stringContains);,c#,winforms,file-io,C#,Winforms,File Io,我必须用其他节点替换root, 所以我在附加文本。但是,上面的代码在现有文本的后面附加了stringContains试试这个 <namespace> <root> <node1> <element 1> <element 1> </node1> <node2> <element 1> <element 1> </node2> </root> string stri

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

试试这个

<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);
stringContains=string.Empty;
var lines=File.ReadLines(路径);
foreach(行中的var行)
{
如果(第行包含(“”))
{
stringContains=line.Replace(“,”+newelement.OuterXml);
}
}
File.writeAllines(路径、行);

但是如果你的文件太大,那么这是一个糟糕的做法。

注意:你不能只更改文件中的一行,你需要读取所有内容,更改所需部分,然后再次写入所有内容

根据您关于文件大小(GBs-long)的信息,实现所需行为的唯一方法是创建新文件并写入初始文件的内容,只更改您需要的行

处理过程应该一行一行地进行(正如您在示例中所示),以达到最小的内存使用

然而,在操作完成之前,这种方法需要硬盘上2倍的空间(假设所有操作完成后您将删除初始文件)


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

看起来像XML文档。为什么不使用内置在.NET中的合适的XML解析器并以这种方式操纵文档?您应该考虑使用XSL转换而不是文本PARSIGN执行这个任务。我的文件是GB的,所以我不想在XMLNoSQL中加载文件来执行性能问题,这就是为什么…我要做的是逐行检查根节点,然后用新节点替换根节点,并附加到现有文件中……thts my scenaro..使用json。这是相当快的,如何在windows窗体应用程序…那么什么是解决方案,因为它读取所有行从我的五
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);