xmlfile aktualisieren

yellowspam

Erfahrenes Mitglied
Hi@all: also ich hab mal wieder ein Problem.

Und zwar habe ich folgenden Source:

Code:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Web.Configuration;
using System.Xml;
using System.IO;
using System.Configuration;


namespace bluestep.DownloadManager
{
    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;
            
        }
                        
        /// <summary>
        /// Überprüft ob ein File existiert oder nicht...
        /// </summary>
        /// <param name="FilePath"></param>
        /// <returns>true... if file exists, 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", DateTime.Now.ToString());
                
                //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               
 }//end namespace

Der Code prüft ob das ile vorhanden ist oder nicht, falls nicht schreibt er ein neues File.
Wenn das File schon existiert springt er ans Ende des Textes und geht 12 zeichen zurück um dann den neuen Tag an den vorherigen anzuhängen.
Aber ich krieg dabei immer folgende Meldung:"Unable seek backward to overwrite data that previously existed in a file opened in Append mode. "

Theoretisch sollte der Code richtig sein,da der </Downloads>-tag genau 12 zeichen lang ist und der writer genau 12 zeichen zurückgeht.
 
Hallo,

die Fehlermeldung ist doch eigentlich aussagekräftig genug? Im Append-Modus können nur Daten angehängt werden; ein Rückwärts-Positionieren des Dateizeigers ist nicht möglich.

Gruß
MCoder
 
Oh...:eek: ..ja aber wie kann ich dann den Dateizeiger so positionieren dass der <download>-tag innerhalb des </Downloads>-tags geschrieben wird?
 
Du musst die Datei ja nicht im Append-Modus öffnen, sondern einfach nur zum Schreiben:
C#:
Stream pfad = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write);
Gruß
MCoder
 
...Du musst die Datei ja nicht im Append-Modus öffnen, sondern einfach nur zum Schreiben...
Darauf bin ich schon gekommen, aber obwohl ich den Dateizeiger um genau die Länge des </Downloads>-tags zurücksetze, wird der </Downloads>-tag überschrieben.
Also ich hab mir gedacht dass ich dann eigentlich nurnoch mit nem XmlReader überprüfen muss ob das </Downloads>-tag da ist oder nicht.
Wen nicht dann soll er es einfach darunter schreiben.

Oder gibts noch ne andere Methode?
 
obwohl ich den Dateizeiger um genau die Länge des </Downloads>-tags zurücksetze, wird der </Downloads>-tag überschrieben.
Das ist logisch, weil das Zurücksetzen des Dateizeigers bedeutet, dass ab der Position geschrieben, aber nicht eingefügt wird.
Also ich hab mir gedacht dass ich dann eigentlich nurnoch mit nem XmlReader überprüfen muss ob das </Downloads>-tag da ist oder nicht.
Wen nicht dann soll er es einfach darunter schreiben.
Ich denke das wird nicht funktionieren, weil die Datei ohne das abschließende </Downloads>-tag ungültiges XML enthält, ao dass der XmlReader wahrscheinlich eine Exception werfen wird. Das Tag solltest du daher in jedem Fall schreiben:
C#:
// ...

if( IsExisting == true )
{
    UTF8Encoding utf8 = new UTF8Encoding();
    string str = "\r\n</Downloads>";
    pfad.Write(utf8.GetBytes(str), 0, utf8.GetByteCount(str));
}

pfad.Flush();
pfad.Close();

 return "alles hat geklappt";
Die Zeile "objWriter.Close();" musst du rausnehmen.

Gruß
MCoder

// Nachtrag: Die sauberste Lösung wäre in jedem Fall die vorhandene Datei einzulesen (XmlReader), entsprechend zu modifizieren und dann wieder komplett zu schreiben.
 
Zuletzt bearbeitet:
Hi, nun jetzt wird das Tag garnicht geschrieben sondern neue <Download>-tag wird angehängt:

Code:
<?xml version="1.0" encoding="Windows-1252" standalone="no"?>
<Downloads>
  <Download>
    <name>Download</name>
    <url>ffslkdf ö</url>
    <CreationTime>09.10.2007 09:16:13</CreationTime>
    <Description>ökdfj sdö ösdf </Description>
  </Download>

</Downloads><Download>
  <name>downloads </name>
  <url>sdölhj </url>
  <CreationTime>09.10.2007 09:18:16</CreationTime>
  <Description>ldhf gljkdhgjklödfh</Description>
</Download>
 
So habe es nun selbst herausgefunden..hatte deinen Code an der falschen Stelle eingefügt. Danke für deine Hilfe..du hast mir sehr geholfen.:)

Eine Frage hätte ich aber noch:
und zwar, wie kriege ich die Einrückungen in den hinzugefügten <Download>-tag?

Habe es so versucht,ging aber nicht:

C#:
objWriter.Formatting = Formatting.Indented;                
                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", DateTime.Now.ToString());
                
                //schreiben einer Beschreibung des Downloads
                objWriter.WriteElementString("Description", txt_content.Text);

                objWriter.WriteEndElement();
                
                // wenn das file nicht 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();

                if (IsExisting == true)
                {  //erstellen einer eincodingvariable utf8 //erstellen eines String mit dem inhalt </Downloads>
                    UTF8Encoding utf8 = new UTF8Encoding(); string str = "\r\n</Downloads>";
                    //schreiben des Strings in das XML-file
                    pfad.Write(utf8.GetBytes(str), 0, utf8.GetByteCount(str));
                }
                //schreiben des Datenstroms
                pfad.Flush();
                //schließen des Streams
                pfad.Close();
                
                return "alles hat geklappt";

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

Neue Beiträge

Zurück