[C#] Unable seek backward to overwrite data that previously existed in a file opened

yellowspam

Erfahrenes Mitglied
Hi@all:

Ich habe ein Problem: Meine applikation schreibt ein XML-file, nun das funktioniert eh tadellos, aber wenn ich dann eine neue node hinzufügen will, dann kommt folgende Fehlermeldung:

"Unable seek backward to overwrite data that previously existed in a file opened in Append mode."

Dabei müßte der Code stimmen, denn filemode.append bedeutet ja dass der nachkommende Text angehängt wird.

Hier mal der Source:

Code:
 public partial class test : System.Web.UI.Page
    {

        // MapPath baut den relativen Pfad in einen absoluten (D:\...) um            
        private string FilePath = HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings["XMLFilePath"].ToString());
        

        protected void btntest(Object Sender, EventArgs e)
        {
            
            string StatusCode = WriteXML(FilePath);
            this.lbl_result.Text = StatusCode;
            
        }

        protected void lnkTest(Object Sender, EventArgs e)
        {
            string StatusCode = WriteXML(FilePath);
            this.lbl_result.Text = StatusCode;
            
        }



        /// <summary>
        /// Überprüft ob ein File existiert oder nicht...
        /// </summary>
        /// <param name="FilePath"></param>
        /// <returns>true... if file existiert, false ... if file is not existing</returns>
        private bool IsFileExisting(string FilePath)
        {
            // variable
            bool IsExisting = false;

            try
            {
                // üperprüfen ob das xml file existiert
                IsExisting = File.Exists(FilePath);
            }
            catch
            {
                // falls in der überprüfung ein Fehler auftritt, gehen wir davon aus
                // dass das File nicht existiert.
                IsExisting = false;
            }

            return IsExisting;
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="FilePath"></param>
        /// <returns>Gibt einen Statuscode retour</returns>
        private string WriteXML(string FilePath)
        {

            try
            {
                // wir überprüfen ob das file existiert
                bool IsExisting = IsFileExisting(FilePath);
                FileMode fileMode = FileMode.OpenOrCreate;

                // wenn die datei existiert, setzen wir den modus zu append
                if (IsExisting == true)
                    fileMode = FileMode.Append;

                Stream pfad = new FileStream(FilePath, fileMode);

                //erstellt einen neuen XMLWriter
                XmlTextWriter objWriter = new XmlTextWriter(pfad, System.Text.Encoding.Default);

                //erzwingen von Syntaxeinrückungen
                objWriter.Formatting = Formatting.Indented;

                // wenn die datei existiert, springen wir an das ende des dokumentes
                // und gehen 12 Zeichen zurück.

                if (IsExisting == true)
                    pfad.Seek(-12, SeekOrigin.End);
            


                // wenn das file nicht existiert schreiben wir die 
                // eröffnungs-node extra ins dokument
                if (IsExisting == false)
                {
                    //beginnt das file zu schreiben
                    objWriter.WriteStartDocument(false);
                    objWriter.WriteStartElement("Downloads");
                }

                objWriter.WriteStartElement("Download");

                //schreiben des namens des Dls
                objWriter.WriteElementString("name", txt_dlname.Text);

                //schreiben der URl
                objWriter.WriteElementString("url", txt_url.Text);

                //schreiben der Uhrzeit der eintragung
                objWriter.WriteElementString("CreationTime", txt_dltime.Text);

                //schreiben einer Beschreibung des Downloads
                objWriter.WriteElementString("Description", txt_content.Text);

                objWriter.WriteEndElement();


                // wenn das file nciht existiert, schreiben wir die 
                // end-node extra ins dokument..
                if (IsExisting == false)
                {
                    objWriter.WriteEndElement();

                    //schließen des Dokumentes
                    objWriter.WriteEndDocument();
                }


                //Datenstrom in XMLfile schreiben 
                objWriter.Flush();

                //speicher freigeben
                objWriter.Close();


                return "alles hat geklappt";

            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }




    }//end class

Wo liegt der (Denk)Fehler?
 

Neue Beiträge

Zurück