Autor Beitrag
Hm...
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 05.04.09 11:55 
Hallo, ich möchte, dass mein Programm einen Dateipfad in eine Datei schreibt. In dieser sind mehrere Dateipfade. Zuerst soll überprüft werden, ob der gleiche Dateipfad vorhanden ist. Wenn ja, dann muss nichts getan werden. Wenn nicht, dann soll das Programm am Ende der Datei eine Zeile hinzufügen und in dieser Zeile den Dateipfad speichern. Ich hab's so probiert, aber der Pfad wird nicht gespeichert:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
            while (!zuende)
            {
                StreamReader readlist = new StreamReader(Application.StartupPath + "carlist.txt");
                zeile = readlist.ReadLine();
                if (String.Equals(zeile,saveFileDialog1.FileName)) { zuende = true; }
                if (readlist.Peek() == -1
                {
                    readlist.Close();
                    StreamWriter savelist = new StreamWriter(Application.StartupPath + "carlist.txt");
                    savelist.WriteLine(saveFileDialog1.FileName);
                    zuende = true
                    savelist.Close();
                }
            }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 05.04.09 12:08 
Hallo,

ich verstehe nicht, warum zum Lesen und Schreiben immer StreamReader und StreamWriter verwendet werden, während es viel einfachere Varianten mit (für deine Bedürfnisse) File.ReadAllLines und File.AppendAllText gibt. Das vereinfacht auch die Prüfungen auf if und while. Also:

1. Lies die Datei am Stück ein; das liefert ein String-Array.
2. Prüfe in einer einfachen Schleife, ob der neue Eintrag schon vorhanden ist.
3. Wenn nicht, dann hänge ihn an die Datei an mit Environment.NewLine.

Punkt 2 kann auch ersetzt werden durch:
2a. Erzeuge aus dem String-Array eine List<string>.
2b. Prüfe mit Contains, ob der neue Eintrag schon vorhanden ist.
Das ist zwar eleganter, dürfte aber eher länger dauern, zumal diese List<> nur einmal benötigt wird.

Übrigens ist für das Erzeugen eines Dateinamens Path.Combine zu empfehlen, das vermeidet Probleme mit fehlendem oder doppeltem Backslash. Schreiben in StartupPath führt vor allem unter Vista zu Problemen; vorzuziehen sind aus Environment.SpecialFolder eher (Common)ApplicationData.

Gruß Jürgen

PS. Zu deinen Problemen: Zum einen kann für die Prüfung auf Dateiende beim Einlesen "zeile != null" verwendet werden. Zum anderen glaube ich, dass savelist.Flush vermisst wird. Außerdem wird der StreamReader nicht in allen Fällen geschlossen, und Dispose fehlt überhaupt; damit das nicht zu Problemen führt, wird grundsätzlich die Einbettung von Reader/Writer in einen using-Block empfohlen.
Hm... Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 05.04.09 15:49 
Hm, hab's so probiert aber es geht immernoch nicht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            bool IstVorhanden = false;
            string[] Pfade = new string[32];
            Pfade = File.ReadAllLines(Application.StartupPath + "carlist.txt");
            for (int i = 0; i < 32; i++)
            {
                if (string.Equals(Pfade[i], saveFileDialog1.FileName)) { IstVorhanden = truebreak; }
                if (string.Equals(Pfade[i], "")) { Pfade[i] = saveFileDialog1.FileName;  break; }
            }
            if (!IstVorhanden) { File.WriteAllLines(Application.StartupPath + "carlist.txt",Pfade); }


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 05.04.09 16:13 
user profile iconHm... hat folgendes geschrieben Zum zitierten Posting springen:
Hm, hab's so probiert aber es geht immernoch nicht:

Das ist keine richtige Problembeschreibung: Woran merkst du, dass es nicht geht? Wird nichts geschrieben, wird etwas falsches geschrieben?

Zu den Fehlern und ungünstigen Verfahren im einzelnen:

Der Pfad ist nicht auf diese Weise zusammenzusetzen. Da du ihn außerdem später nochmals brauchst, ist eine eigene Variable sinnvoll:
ausblenden C#-Quelltext
1:
string carlistFilename = Path.Combine(Application.StartupPath, "carlist.txt");					


Die folgenden Zeilen sind zusammenzuziehen. Es ist nicht sinnvoll, zuerst ein Array für 32 Elemente zu erzeugen, wenn anschließend automatisch eines für 4, 28 oder 317 Elemente entsteht. Lass das doch den Rechner selbst bestimmen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
//  nicht so:
string[] Pfade = new string[32];
Pfade = File.ReadAllLines(Application.StartupPath + "carlist.txt");

// sondern so:
string[] carlist = File.ReadAllLines(carlistFilename);

Du hast dabei übrigens auch noch das Problem, dass Speicherplatz für 32 Strings reserviert wird, aber kein einziger String erstellt wird - auch kein leerer. Deshalb geht deine Abfrage mit Equals( "") ins Leere; sie wird vermutlich niemals mit true beantwortet.

Es gibt keinen Grund, eine for-Schleife mit genau 32 Elementen zu verwenden. Dafür gibt es schließlich foreach:
ausblenden C#-Quelltext
1:
foreach(string carname in carlist) { ... }					


Strings können mit "==" verglichen werden. Für leere Zeilen ist eine spezielle Methode vorgesehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
   if( !String.IsNullOrEmpty(carname) && (carname == saveFileDialog1.FileName) ) {
      IsAvailable = true;
      break;
   }


Warum nimmst du nicht den von mir vorgeschlagenen Befehl zum Speichern?
ausblenden C#-Quelltext
1:
2:
3:
if ( !IsAvailable) {
   File.AppendAllText(carlistFilename, saveFileDialog1.FileName + Environment.NewLine);
}

So, auf ein Neues. Jürgen

PS 1. Zum Markieren von Code gibt es die Auswahl C#, bitte benutze sie auch.

PS 2. Wie du siehst, empfehle ich englische Bezeichner. Spätestens wenn die IDE einen EventHandler wie MyButtonClick erstellt, gäbe es andernfalls schlimmen denglischen Mischmasch.