覆盖文件,但仍然读取内容

本文关键字:读取 文件 覆盖 | 更新日期: 2023-09-27 18:05:47

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

如果我有下面的"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,但这意味着我无法读取内容。

覆盖文件,但仍然读取内容

您必须使用FileStream。SetLength:

stream.SetLength(stream.Position);

之后,您已完成写入。
当然,假设该位置位于写入数据的末尾。

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

你可以这样做:

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也可以在流上读写,但还没有尝试过。