C#创建新的XML文件附加旧的';删除';XML文件

C#创建新的XML文件附加旧的';删除';XML文件,c#,xml,C#,Xml,我正在成功地创建一个XML文件,但是,如果用户试图创建一个新的XML来覆盖以前的版本,它会添加数据;不覆盖 理解这一点给我带来麻烦的是,在创建XML文件之前,我首先检查该文件是否存在,如果确实存在,则删除它,然后创建新的XML文件。我通过调试器运行了我的代码,并查看了文件存储的目录,我可以清楚地看到文件被创建、删除,然后被重新创建 // Create new KML file string filepath = STK_TEMP + "/" +

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

使用

使用


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()
块将代码>从
中删除。这很有意义。。。很高兴你明白了。再次感谢你的帮助!那是有道理的。。。很高兴你明白了。再次感谢你的帮助!