假设一个写入XML文件的上下文情景
//打算将这个DataSet对象的内容写入xml文件中
DataSet dataSet = new DataSet("Example");
//首先以文件流的形式打开xml文件
FileStream fs = File.Open(fileName, FileMode.OpenOrCreate);
//而后将dataSet的内容写入该文件流
dataSet.WriteXML(fs, XmlWriteMode.WriteSchema);
//写入缓存,关闭文件
fs.Close();
如上代码在执行多次后很可能会出现异常,异常信息为“根级别上的数据无效。”
这是由于多次执行过程中,若上次写入的字符串长度为100,那么本次打开的文件流包含100个字符,而这次写入的字符串长度为90,那么WriteXML方法会用这90个字符覆盖文件流中的前90个字符,而倒数10个字符却未被覆盖,依然保留着,成为一个“小尾巴”。
如第一次写入的内容是:
<Example>
<Say>This is not a Example</Say>
</Example>
想在第二次写入的内容是:
<Example>
<Say>This is a Example</Say>
</Example>
那么第二次写入后,内容可能会变成
<Example>
<Say>This is a Example</Say>
</Example>ple>
注意最后一行留下的“尾巴”——ple>
为了解决这个问题,在每次写入之前用SetLength()方法清空打开的文件流即可,如下所示:
//打算将这个DataSet对象的内容写入xml文件中
DataSet dataSet = new DataSet("Example");
//首先以文件流的形式打开xml文件
FileStream fs = File.Open(fileName, FileMode.OpenOrCreate);
//将文件流长度设为0,即可清空其中的内容
fs.SetLength(0);
//而后将dataSet的内容写入该文件流
dataSet.WriteXML(fs, XmlWriteMode.WriteSchema);
//写入缓存,关闭文件
fs.Close();