2009-01-15 68 views
2

当试图用这样的片段,以取代在C#.NET的XML文件的内容:如何在C#.NET中替换现有XML文件的内容?

string file = Path.GetTempFileName(); // pretend this is a real file 
string tmpFile = Path.GetTempFileName(); 

using (var writer = XmlWriter.Create(File.Create(tmpFile))) 
{ 
    writer.WriteStartElement("root"); 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteElementString("test", null, 
      "All work and no play makes Jack a dull boy"); 
    } 
    writer.WriteEndElement(); 
} 

File.Delete(file); 
File.Move(tmpFile, file); 

...我得到一个System.IO.IOException声称该文件已经被另一个进程打开。

回答

7

出于某种原因,XmlWriter类显然不会为临时文件处置基础流。将流放在它自己的“using”子句中可确保流正确关闭。将代码更改为

string file = Path.GetTempFileName(); // pretend this is a real file 
string tmpFile = Path.GetTempFileName(); 

using (var stream = File.Create(tmpFile)) 
using (var writer = XmlWriter.Create(stream)) 
{ 
    writer.WriteStartElement("root"); 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteElementString("test", null, 
      "All work and no play makes Jack a dull boy"); 
    } 
    writer.WriteEndElement(); 
}     
File.Delete(file); 
File.Move(tmpFile,file); 

...使IOException消失并按预期工作。

+0

更新答案与链接使用语句建议由格雷戈D – 2009-01-16 22:29:20

4

使用语句可以链接。稍微修改代码:

string file = Path.GetTempFileName(); // pretend this is a real file 
string tmpFile = Path.GetTempFileName(); 

using (var stream = File.Create(tmpFile)) 
using (var writer = XmlWriter.Create(stream)) 
{ 
    writer.WriteStartElement("root"); 
    for (int i = 0; i < 100; i++) 
    { 
     writer.WriteElementString("test", null, 
      "All work and no play makes Jack a dull boy"); 
    } 
    writer.WriteEndElement(); 
}     
File.Delete(file); 
File.Move(tmpFile,file); 

如果你正在处理在同一范围内(不常有的事)多功能一次性的实体,这样就避免了nastily深度嵌套。 :)

+0

很酷,我不知道这...我想可以安全地假设使用的统计信息是倒序关闭,即最后一次性的对象首先被处置? – 2009-01-15 21:10:53