2

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

如果我有以下“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*但这意味着打开两个文件。有没有办法说“我想打开这个文件,读取它的数据,当我保存时删除旧的内容”而不关闭并重新打开文件?我发现的其他解决方案包括FileMode.Truncate,但这意味着我无法阅读内容。

4

2 回答 2

3

您必须像这样使用FileStream.SetLength

stream.SetLength(stream.Position);

写完之后。
当然,假设位置在写入数据的末尾。

于 2013-03-25T10:22:24.657 回答
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 也可以在流上读写,但还没有尝试过。

于 2013-03-25T10:23:09.743 回答