C#创建新的XML文件会附加旧的“已删除”XML文件

时间:2013-07-12 18:39:35

标签: c# xml

我正在成功创建一个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没有被正确处理......

enter image description here

4 个答案:

答案 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)

我意识到了我的问题......不幸的是,这对我来说是一个非常粗心的错误。创建/覆盖现有文件时,不会重置存储在我的变量中的数据。

谢谢大家帮我解决这个问题。