我正在成功创建一个XML文件,但是,如果用户尝试创建一个新的XML以试图覆盖以前的版本,那么它会附加数据;不会覆盖。
让我无法理解这一点的原因是我首先在创建XML文件之前检查文件是否存在,如果确实存在,我将其删除然后创建新的XML文件。我通过调试器运行了我的代码并查看了文件存储位置的目录,我可以清楚地看到正在创建的文件,然后删除,然后重新创建。
// Create new KML file
string filepath = STK_TEMP + "/" + stkObjectClass + "-" + stkObjectName + ".kml";
if(File.Exists(filepath))
File.Delete(filepath);
StreamWriter xmlsteam = new StreamWriter(filepath);
using (XmlTextWriter xmlWriter = new XmlTextWriter(xmlsteam))
{
xmlWriter.Formatting = Formatting.Indented;
xmlWriter.Indentation = 2;
// Open KML file for appending data
xmlWriter.WriteStartDocument();
// Write KML
xmlWriter.WriteStartElement("kml", "http://earth.google.com/kml/2.1");
xmlWriter.WriteStartElement("Document");
xmlWriter.WriteStartElement("name");
xmlWriter.WriteString(stkObjectName);
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("Placemark");
// Append data from LLA / KML position report
xmlWriter.WriteStartElement("LineString");
xmlWriter.WriteStartElement("altitudeMode");
xmlWriter.WriteString("absolute");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("coordinates");
xmlWriter.WriteString(kmlCoordinateString);
xmlWriter.WriteEndElement(); // END Coordinates
xmlWriter.WriteEndElement(); // END Point
xmlWriter.WriteEndElement(); // END Placemark
bool isFirstPoint = true;
double seconds = 0;
// Create individual poitns for Google Earth playback
foreach (string kmlPoint in kmlCoordinateList)
{
xmlWriter.WriteStartElement("Placemark");
xmlWriter.WriteStartElement("Style");
xmlWriter.WriteStartElement("IconStyle");
xmlWriter.WriteStartElement("Icon");
xmlWriter.WriteStartElement("href");
xmlWriter.WriteString("http://maps.google.com/mapfiles/kml/paddle/wht-blank.png");
xmlWriter.WriteEndElement(); // END href
xmlWriter.WriteEndElement(); // END Icon
xmlWriter.WriteEndElement(); // END IconStyle
xmlWriter.WriteEndElement(); // END Style
xmlWriter.WriteStartElement("TimeStamp");
xmlWriter.WriteStartElement("when");
xmlWriter.WriteString(DateTime.Now.AddSeconds(seconds).ToString("yyyy-MM-ddTHH:mm:ssZ"));
xmlWriter.WriteEndElement(); // END when
xmlWriter.WriteEndElement(); // END TimeStamp
xmlWriter.WriteStartElement("Point");
xmlWriter.WriteStartElement("altitudeMode");
xmlWriter.WriteString("absolute");
xmlWriter.WriteEndElement(); // END altitudeMode
xmlWriter.WriteStartElement("coordinates");
xmlWriter.WriteString(kmlPoint);
xmlWriter.WriteEndElement(); // END coordinates
xmlWriter.WriteEndElement(); // END Point
xmlWriter.WriteEndElement(); // END Placemark
seconds++;
}
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
}
xmlsteam.Dispose();
如果我关闭我的应用程序并启动它并尝试创建该文件,它将在第一次尝试时覆盖它。保持应用程序打开并尝试使用相同的文件路径创建新文件,它只是附加数据。
有什么想法吗?
我觉得我的XmlTextWriter没有被正确处理......
答案 0 :(得分:3)
使用
StreamWriter xmlsteam = new StreamWriter(filepath,false);
答案 1 :(得分:3)
将xmlsteam
的分配更改为以下内容:
StreamWriter xmlsteam = new StreamWriter(filepath, false);
添加false
作为参数会强制它覆盖文件而不是追加:
http://msdn.microsoft.com/en-us/library/36b035cb.aspx
作为一项补充措施,请在创建xmlsteam
之后立即添加以下行:
xmlsteam.AutoFlush = true;
这将确保在每次文件操作后自动刷新文件的所有缓冲区。
在进一步研究之后,我认为问题在于你在处理依赖它的资源之前调用了xmlsteam.Dispose()
。您应该将代码的结尾修改为以下内容:
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
} // end of 'using' block
xmlsteam.Dispose();
答案 2 :(得分:0)
请参阅StreamWriter constructor documentation。第二个参数确定是否覆盖或附加现有文件。从文档中传递
如果要将数据附加到文件,则为true; false覆盖文件。如果指定的文件不存在,则此参数无效,构造函数将创建新文件。
答案 3 :(得分:0)
我意识到了我的问题......不幸的是,这对我来说是一个非常粗心的错误。创建/覆盖现有文件时,不会重置存储在我的变量中的数据。
谢谢大家帮我解决这个问题。