C# - Speichern mehrerer Datensätze in einer Datei



  • Hi Leute,

    ich habe ein kleines Problem. Aber erstmal sollte ich vielleit sagen, das ich gerade anfage zu programmieren. Habe also noch nicht so viel Ahnung.

    Ich bin gerade dabei ein Joining - Tool für das Game Operation Flashpoint zu schreiben. Ich will in diesem Tool eine Liste mit Servern speichern. Das speichern der Liste in einer Datei habe ich schon hinbekommen. Nur das Problem ist, das ich da im Moment nur ein Server speicher kann. Ich habe auch schon mit Bücher über C# und der Hilfe vom Borland C# Builder dieses Problem zu lösen. Doch leider ohne Erfolg.

    Im Moment benutze ich zum speichern der Daten eine *.resouses Datei. Da ich über das speichen in *.ini Dateien nichts gefunden habe.

    Nun meine frage an euch, wie bekomme ich es hin, das ich in einer Datei mehrere Datensätze speichern kann und natürlich die dann auch auslesen kann. ( das auslesen des einen momentanen Datensatzes funktioniert )
    Zum Anzeigen der Datensätze benutze ich ein ListView.

    Danke
    Karsten



  • Hi,

    wenn du Datensätze in einer Listview anzeigst, benutzt du wahrscheinlich ein DataSet. In demFalle wäre XML Das richtige speichermedium.

    Beispiel:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcon/html/vbwlkWalkthroughAccessingXMLData.asp

    die andere Möglichkeit ist, ein Datensatz in einer serialisierbaren Klasse abzubilden.
    Dazu implementierst du die Schnittstelle ISerializable in der Klasse.

    Ein Beispiel findest du in der Hilfe zum Thema ISerializable



  • hier ein Beispiel zu Version B:

    using System.Runtime.Serialization;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace WindowsApplication2
    {
          // Klasse, die die Daten eines Datensatzes enthält 
    	[Serializable()] 
    	class Datensatz :ISerializable
    	{
    		public String Name;
    		public int  Personal_NR;
    
    		public Datensatz(SerializationInfo info, StreamingContext context)
    		{
                 // dieser Konstruktor wird von formater.Deserialize(stream) aufgerufen, um jedes Element zu erzeugen
    			Name=(string)info.GetValue("Name",typeof(string));
    			Personal_NR=(int)info.GetValue("Personal_NR",typeof(int));
    		}
    		public Datensatz(String AName, int AID)
    		{
    			Name=AName;
    			Personal_NR=AID;
    		}
    		void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    		{
                // diese Methode wird von formater.Serialize(stream,List) für jedes Element aufgerufen 
    			info.AddValue("Name",Name);
    			info.AddValue("Personal_NR",Personal_NR);
    		}
    
    	}
    	public class Form1 : System.Windows.Forms.Form
    	{
    		private System.Windows.Forms.Button button1;
    		private System.Windows.Forms.Button button2;
    		private System.Windows.Forms.TextBox textBox1;
    		private System.ComponentModel.Container components = null;
    
    		public Form1()
    		{
    			InitializeComponent();
    		}
    
    		protected override void Dispose( bool disposing )
    		{
    			if( disposing )
    			{
    				if (components != null) 
    				{
    					components.Dispose();
    				}
    			}
    			base.Dispose( disposing );
    		}
    
    		#region Windows Form Designer generated code rausgelöscht
                #endregion 
    		[STAThread]
    		static void Main() 
    		{
    			Application.Run(new Form1());
    		}
    		private void button1_Click(object sender, System.EventArgs e)
    		{
    			// Datensätze erzeugen und in eine ArrayList packen.
    			ArrayList List=new ArrayList();
    			List.Add(new Datensatz("Andreas",1));
    			List.Add(new Datensatz("Thomas",2));
    			List.Add(new Datensatz("Markus",3));
    
    			// Dateistream erzeugen und Daten speichern
    			Stream stream =File.Open("C:\\file.dat",FileMode.Create);
    			BinaryFormatter formater=new BinaryFormatter();
    			formater.Serialize(stream,List);
    			stream.Close();
    		}
    
    		private void button2_Click(object sender, System.EventArgs e)
    		{			
                      // Dateistream zum lesen öffnen
    			Stream stream =File.Open("C:\\file.dat",FileMode.Open);
    			BinaryFormatter formater=new BinaryFormatter();
                      // Datensätze in eine ArrayList einlesen 
    			ArrayList dat=(ArrayList) formater.Deserialize(stream);	
    			stream.Close();
    			// Datensätze ausgeben
    			foreach (Datensatz satz in dat)
    			{
    				textBox1.AppendText(satz.Name);
    			}
    		}
    	}
    }
    


  • Hallo Andreas,

    ich danke Dir erstmal für Deine schnelle Hilfe. Werde das mal ausprobieren. Poste dann auch mal meinen Code wenn es mit Deinem geklappt hat. Vielleicht kannst Du mir dann auch sagen, was ich falsch gemacht habe. Ach ich poste Ihn jetzt.

    Das ist halt nur der Teil, wo ich den Text speicher.

    private void bHinzufügen_Click(object sender, System.EventArgs e)
    		{
    
    			AddServers myServers = new AddServers();
    			myServers.ServerIP = this.tBAdresse.Text;
    			myServers.ServerPort = this.tBPort.Text;
    			myServers.ServerPasswort = this.tBPasswort.Text;
    			myServers.ServerParameter = this.tBParameter.Text;
    			arrAddServer.Add(myServers);
    
    			System.Resources.ResourceWriter resWriter = new System.Resources.ResourceWriter(Application.ProductName +".resoures");
    			resWriter.AddResource("ServerIP",this.tBAdresse.Text);
    			resWriter.AddResource("ServerPort",this.tBPort.Text);
    			resWriter.AddResource("ServerPasswort",this.tBPasswort.Text);
    			resWriter.AddResource("ServerParameter",this.tBParameter.Text);
    			resWriter.Generate();
    			resWriter.Close();
    			this.Close();
    		}
    

    und hier, wo ich Ihn wieder einfüge.

    static void Main()
    		{
    			char chrTrennz = System.IO.Path.DirectorySeparatorChar;
    			string strDateiname = Application.StartupPath+chrTrennz.ToString() + Application.ProductName +".resoures";
    			if (System.IO.File.Exists(strDateiname))
    			{
    			System.Resources.ResourceReader resReader = new System.Resources.ResourceReader(Application.ProductName +".resoures");
    			IDictionaryEnumerator enRes = resReader.GetEnumerator();
    			while (enRes.MoveNext())
    				{
    				if (enRes.Key.ToString()=="ServerIP")
    					{
    					strServerIP=(string) enRes.Value;
    					}
    				else if (enRes.Key.ToString()=="ServerPort")
    					{
    					strServerPort=(string) enRes.Value;
    					}
    				else if (enRes.Key.ToString()=="ServerPasswort")
    					{
    					strServerPasswort=(string) enRes.Value;
    					}
    				else if (enRes.Key.ToString()=="ServerParameter")
    					{
    					strServerParameter=(string) enRes.Value;
    					}
    				}
    				resReader.Close();
    
    .........
    
    private void MainForm_Load1(object sender, System.EventArgs e)
    		{
    			ListViewItem pItem = new ListViewItem();
    			pItem.Text = "offline";
    			pItem.SubItems.Add(strServerIP);
    			pItem.SubItems.Add(strServerPort);
    			pItem.SubItems.Add("c");
    			pItem.SubItems.Add("d");
    			pItem.SubItems.Add("e");
    			pItem.SubItems.Add("f");
    			pItem.SubItems.Add("g");
    			lVServer.Items.Add(pItem);
    

    Danke
    Karsten



  • Hi,

    dass du nur ein Server in der Datei findest ist klar:

    System.Resources.ResourceWriter resWriter = new System.Resources.ResourceWriter(Application.ProductName +".resoures");
    

    wenn du so schreibst, überschreibst du alle vorhandenen Enträge.

    Machs so:

    Stream stream =File.Open(Application.ProductName +".resoures",FileMode.Append,FileAccess.Write);
    			System.Resources.ResourceWriter resWriter=new  System.Resources.ResourceWriter(stream );
    


  • Also nochmals Danke für Deine Hilfe. Mein Problem mit dem schreiben mehrerer Datensätze hat sich jetzt erledigt. Es funktioniert ohne Probleme. Jetzt kann ich mich daran machen, die Daten wieder auszulesen und auch dann im ListView anzeigen zu lassen.

    Danke Karsten



  • Hi Andreas,

    habe jetzt mal son bisschen ausprobiert und bin zu der ansicht gekommen, das ich es vielleicht doch mit XML und dem DataGrid machen sollte. Habe in meinem Buch " C# Der leichte Einstieg, von Helma Spora " ein Tutorial zum erstellen von XML - Datein und das auslesen und bearbeiten gefunden. War gar nicht so schwer. Aber nochmals ein fettes Danke für Deine mühe.

    Gruß Karsten


Anmelden zum Antworten