覆盖文件但仍然读取内容

时间:2013-03-25 10:18:38

标签: c# xml file-io linq-to-xml

我试图找到最合理的方式来打开文件,修改其内容然后将其写回文件。

如果我有以下" MyFile.xml"

<?xml version="1.0" encoding="utf-8"?>
<node>
  <data>this is my data which is long</data>
</node>

然后想根据这个修改它:

private static void Main(string[] args)
{
    using (FileStream stream = new FileStream("Myfile.xml", FileMode.Open))
    {
        XDocument doc = XDocument.Load(stream);
        doc.Descendants("data").First().Value = "less data";
        stream.Position = 0;
        doc.Save(stream);
    }
}

我得到以下结果。请注意,由于总文件长度小于之前我在结尾处获得不正确的数据。

<?xml version="1.0" encoding="utf-8"?>
<node>
  <data>less data</data>
</node>/node>

我想我可以使用File.ReadAll*File.WriteAll*,但这意味着有两个文件开头。是不是有某种说法&#34;我想打开这个文件,读取它的数据,当我保存删除旧内容时#34;没有关闭并重新打开文件?我发现的其他解决方案包括FileMode.Truncate,但这意味着我无法阅读内容。

2 个答案:

答案 0 :(得分:3)

你必须像这样使用FileStream.SetLength

stream.SetLength(stream.Position);

之后你已经写完了。
当然,假设位置在书面数据的末尾。

答案 1 :(得分:2)

为什么首先将文件读入文件流?

您可以执行以下操作:

private static void Main(string[] args]
{
   string path = "MyFile.xml";
   XDocument doc = XDocument.Load(path);
   // Check if the root-Node is not null and other validation-stuff
   doc.Descendants("data").First().Value = "less data";
   doc.Save(path);
}

流的问题是,您可以读取或写入。

我已经读过,使用.net-Framework 4.5,它也可以在流上读写,但还没有尝试过。