C#创建新的XML文件附加旧的';删除';XML文件
我正在成功地创建一个XML文件,但是,如果用户试图创建一个新的XML来覆盖以前的版本,它会添加数据;不覆盖 理解这一点给我带来麻烦的是,在创建XML文件之前,我首先检查该文件是否存在,如果确实存在,则删除它,然后创建新的XML文件。我通过调试器运行了我的代码,并查看了文件存储的目录,我可以清楚地看到文件被创建、删除,然后被重新创建C#创建新的XML文件附加旧的';删除';XML文件,c#,xml,C#,Xml,我正在成功地创建一个XML文件,但是,如果用户试图创建一个新的XML来覆盖以前的版本,它会添加数据;不覆盖 理解这一点给我带来麻烦的是,在创建XML文件之前,我首先检查该文件是否存在,如果确实存在,则删除它,然后创建新的XML文件。我通过调试器运行了我的代码,并查看了文件存储的目录,我可以清楚地看到文件被创建、删除,然后被重新创建 // Create new KML file string filepath = STK_TEMP + "/" +
// 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没有被正确处理
使用
使用
将
xmlsteam
的赋值更改为以下内容:
StreamWriter xmlsteam = new StreamWriter(filepath, false);
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
} // end of 'using' block
xmlsteam.Dispose();
添加false
作为参数将强制其覆盖文件,而不是追加:
作为一项附加措施,在创建xmlsteam
之后添加以下行:
xmlsteam.AutoFlush = true;
这将确保在每次文件操作后自动刷新文件的所有缓冲区
进一步研究后,我认为问题在于,在处理依赖它的资源之前,您正在调用xmlsteam.Dispose()
。您应该将代码结尾修改为以下内容:
StreamWriter xmlsteam = new StreamWriter(filepath, false);
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
} // end of 'using' block
xmlsteam.Dispose();
将
xmlsteam
的赋值更改为以下内容:
StreamWriter xmlsteam = new StreamWriter(filepath, false);
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
} // end of 'using' block
xmlsteam.Dispose();
添加false
作为参数将强制其覆盖文件,而不是追加:
作为一项附加措施,在创建xmlsteam
之后添加以下行:
xmlsteam.AutoFlush = true;
这将确保在每次文件操作后自动刷新文件的所有缓冲区
进一步研究后,我认为问题在于,在处理依赖它的资源之前,您正在调用xmlsteam.Dispose()
。您应该将代码结尾修改为以下内容:
StreamWriter xmlsteam = new StreamWriter(filepath, false);
xmlWriter.WriteEndElement(); // END KML
// END KML file and close
xmlWriter.WriteEndDocument();
xmlWriter.Flush();
xmlWriter.Close();
} // end of 'using' block
xmlsteam.Dispose();
看。第二个参数确定是否覆盖或附加现有文件。从文档中,通过
true将数据追加到文件中;false将覆盖该文件。如果指定的文件不存在,则此参数无效,构造函数将创建一个新文件
看。第二个参数确定是否覆盖或附加现有文件。从文档中,通过
true将数据追加到文件中;false将覆盖该文件。如果指定的文件不存在,则此参数无效,构造函数将创建一个新文件
我意识到我的问题。。。不幸的是,这是我一个非常粗心的错误。在创建/覆盖现有文件时,存储在my variables中的数据不会被重置
谢谢大家在这个问题上帮助我。我意识到了我的问题。。。不幸的是,这是我一个非常粗心的错误。在创建/覆盖现有文件时,存储在my variables中的数据不会被重置
谢谢大家试图帮助我解决这个问题。你能发布完整的代码吗?我们能看看你在哪里检查文件是否存在并删除它的安全内容吗。还添加了存储文件的文件夹。它确实会删除该文件(我使用断点确保它已从目录中删除),然后在我创建时,它会将新信息添加到“已删除”版本中存储的旧信息的顶部。您可以发布完整代码吗?我们可以看到您在何处检查该文件是否存在并删除其内容吗。还添加了存储文件的文件夹。它确实删除了文件(我使用了断点来确保它已从目录中删除),然后在我创建时,它将新信息添加到“已删除”版本中存储的旧信息的顶部。我添加了这个,但它仍在添加数据。即使在文件被删除后,我的程序也会将旧文件备份并添加数据,而不是覆盖它。同样,它仍然会将数据添加到“已删除”文件中。这就好像它仍然将上一个文件中的数据存储在内存中,但我不明白这是怎么可能的。我确实设置了一个断点,该文件肯定被删除了。我做了所有这些,除了xmlWriter.Dispose()。我在我的代码中声明:使用(XmlTextWriter xmlWriter=new XmlTextWriter(xmlsteam)),它在代码块的末尾显式地调用dispose。我认为问题在于,在处理
xmlWriter
本身之前,您正在处理xmlWriter
的基流。您至少应该移动xmlsteam.Dispose()代码>使用
块从中删除。我添加了这个,但它仍然在追加数据。即使在文件被删除后,我的程序也会将旧文件备份并添加数据,而不是覆盖它。同样,它仍然会将数据添加到“已删除”文件中。这就好像它仍然将上一个文件中的数据存储在内存中,但我不明白这是怎么可能的。我确实设置了一个断点,该文件肯定被删除了。我做了所有这些,除了xmlWriter.Dispose()。我在我的代码中声明:使用(XmlTextWriter xmlWriter=new XmlTextWriter(xmlsteam)),它在代码块的末尾显式地调用dispose。我认为问题在于,在处理xmlWriter
本身之前,您正在处理xmlWriter
的基流。您至少应该移动xmlsteam.Dispose()使用
块将代码>从中删除。这很有意义。。。很高兴你明白了。再次感谢你的帮助!那是有道理的。。。很高兴你明白了。再次感谢你的帮助!