覆盖文件,但仍然读取内容
本文关键字:读取 文件 覆盖 | 更新日期: 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也可以在流上读写,但还没有尝试过。