[C#] Textdatei in Hashtable abspeichern

hauke1981

Erfahrenes Mitglied
Hallo zusammen,

ich versuche den Inhalt einer Textdatei in eine Hashtable zu speichern. Die Datei wird vorher über ein OpenFileDialog ausgewählt. Jetzt weiss ich aber leider nicht wie ich das hinbekommen kann und kontrollieren kann das die Inhalte wirklich abgespeichert wurden.

Ich hab als erstes das Problem das ich einen FileStream erstelle und diesem ja einen Pfad in Form eines Strings angeben muss bzw. möchte. Wie mache ich das dann in Verbindung mit einem OpenFileDialog? Komme einfach nicht weiter, hoffe das mir einer helfen kann.

Wenn einer ein Tutorial dazu hat wär das auch sehr gut.

Grüße
 
Wenn du in der MSDN nach dem OpenFileDialog (http://msdn.microsoft.com/de-de/library/system.windows.forms.openfiledialog(VS.80).aspx) suchst, erhälst du ausreichend Informationen, inkl. Beispielen zu diesem Dialog.

Über dessen ShowDialog() gibt dir einen DialogResult-Wert zurück, z.B. um auszuwerten ob der Benutzer auf Abbrechen geklickt hat.

Um sicherzustellen, dass der Stream tatsächlich gespeichert wurde, setzt du um den entsprechenden Block ein Try-Catch Block. Tritt ein Fehler auf, wertest du die Exception aus und kannst entsprechend reagieren.
 
Hi habs soweit hinbekommen, danke nochmal.
Weisst du zufälligerweise wie ich den Dateinamen der ausgewählten Datei anzeigen lassen kann? Ich meine ohne den kompletten Pfad, den zeigts bei mir nämlich mit an.
 
Noch eine kleine Fragen hab ich.

Ich gebe folgenden Satz in einer Textbox aus:

Code:
textBox1.AppendText(string.Format("Key {0} is not in all files available\r\n\r\n",key.ToString()));

Der Key der angezeigt wird befindet sich in einer bestimmten Datei deren Name ich dort an der Stelle gerne mit ausgeben lassen würde. Das Problem ist, dass ich das in einer If Abfrage drin stehen habe und ich mehrere Dateien ausgewählt habe (über einen OpenFileDialog). Wie kann ich jetzt den Dateinamen anzeigen lassen in dem der angezeigte Key fehlt? Da bin ich am ausprobieren bis jetzt bin ich aber nicht weitergekommen. Weisst du das?
 
Sorry, aber jetzt muss ich mal was loswerden: Ich helfe dir gerne bei deinem
Problem, sonst würde ich ja nicht antworten, aber... auch die letzte Frage hätte man durch einen schnellen Klick in der MSDN (den Link zum OpenFileDialog findest du oben) finden können. Ich habe ja auch nicht alles im Kopf und habe gerade schnell nachgeschaut...

Da ich aber so nett bin: http://msdn.microsoft.com/de-de/library/system.windows.forms.openfiledialog_members(VS.80).aspx dort gibts eine Eigenschaft Filenames (beachte das S am Ende), diese liefert alle markierten Dateinamen.

Und jetzt ist 'ne Bewertung fällig ;-)
 
Bewertung hab ich vorher schon gemacht ;-)

Auch habe ich das alles schon mit FileNames ausprobiert es zeigt aber immer nur eine Datei an. Deswegen hab ich ja auch die Frage gestellt, hab bei MSDN nicht das passende gefunden.

Hier nochmal ein bisschen genauer was ich versuche zu machen.

Folgenden Code habe ich in einer mehrfachen if Abfrage drinstehen.
Code:
textBox1.AppendText(string.Format("Key {0} is not in all files available\r\n\r\n",key.ToString()));

Es geht ja darum, dass ich den Inhalt von zwei oder mehr Textdateien vergleiche. Das funktioniert alles. Jetzt wird halt leider nicht angezeigt in welcher Datei eine Zeile fehlt. Wenn eine Zeile fehlt wird folgender Satz wie oben im Code ersichtlich ausgegeben. Ich will da dann mitausgeben um welche Datei es sich handelt. Das mit den FileNames hab ich ja alles schon hinter mir.

Die Ausgabe sollte dann folgendermaßen aussehen:
Datei test.txt: Key xyz is not in all files available.

Bisher sieht es so aus
Key xyz is not in all files available.

Hoffe das mein Problem jetzt besser rausgekommen ist.
 
Poste mal ein wenig mehr Code... dann kann ich mir mal ein Bild davon machen, was du genau treibst.

Edit:
Ich denke mal du loopst über die Dateien die im OpenFileDialog markiert wurden. Deren Dateinamen erhälst du ja über das Array Filenames, welches der Dialog ausgibt.
Wie genau dein Vergleich funktioniert weiß ich nicht, bzw, gegen was du vergleichst (jede Datei mit einer Art Masterdatei in der alle Keys drinstehen oder jede Datei mit jeder anderen Datei), sollte aber auch egal sein.

Du könntest ein Dictionary<string, string> verwenden, Als Key verwendest du den Dateinamen, als Value den fehlenden Key. Nachdem du über alle Dateien geloopt, deine Vergleiche ausgeführt und die fehlenden Keys protokolliert hast, kann über das Dictionary loopen und die entsprechenden Ausgaben machen.
 
Zuletzt bearbeitet:
Code:
if (ofd1.ShowDialog() != DialogResult.OK) return;

            List<Hashtable> hashes = new List<Hashtable>();

            for (int i = 0; i < ofd1.FileNames.Length; i++)
            {
                Hashtable ht = new Hashtable();
                hashes.Add(ht);

                FileStream intStream = File.OpenRead(ofd1.FileNames[i]);
                StreamReader sr = new StreamReader(intStream, Encoding.Default);
                char[] sep = new char[] { ' ' };
                while (!sr.EndOfStream)
                {
                    string[] str = sr.ReadLine().Split(sep, 2);
                    try
                    {
                        if (str.Length <= 1) continue;

                        //do not store comments from language files
                        if (str[0].StartsWith(@"//")) continue;

                        if (ht.ContainsKey(str[0]))
                        {
                            System.Diagnostics.Debug.Assert(false, "key exists yet");
                            textBox1.AppendText (string.Format ("ID {0} exists more than once",str[0]));
                            continue;
                        }
                        ht.Add(str[0], str[0]);

                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.Assert(false, "Error reading file." + ex.Message);
                    }

                }
            }
            
            textBox1.AppendText("The Files which you have selected are: \r\n");
            for (int i = 0; i < ofd1.FileNames.Length; i++)
            {
                textBox1.AppendText(Path.GetFileName(ofd1.FileNames[i])+"\r\n");
            } 
            
            CompareFiles(hashes);
            }

        private void CompareFiles(List<Hashtable> hashes)
        {
            for (int i = 0; i < hashes.Count; i++)
            {
                foreach (object key in hashes[i].Keys)
                {
                    for (int y = 0; y < hashes.Count; y++)
                    {
                        if (y == i) continue;

                        if (hashes[y].ContainsKey(key) == true) continue;

                        textBox1.AppendText(string.Format("Key {0} is not in all files available\r\n",key.ToString()));
                    }
                }
            }

            textBox1.AppendText("\r\nFinished comparing. All Keys are similar.");
        }

So jetzt hab ich dir mal nen bisschen mehr Code gepostet, hoffe du kommst damit klar.

Grüße und danke
 
Hi,

ich schaue mich das später mal genauer an, wenn ich etwas Zeit finde...
eine Info noch: Ich habe oben ziemlichen Schrott damit geschrieben, dass du als Value des Dictionary einen String verwenden sollst, ... macht so keinen Sinn ;)

Die Hashtable solltest du ebenfalls nicht mehr verwenden.

Verwende stattdessen ein Dictionary jedoch wie folgt:
C#:
Dictionary<string, List<string>> hashes;

Passe dann die Compare Methode entsprechend an.
Praktischerweise hast du dann stehts über den Key des Dictionary den Dateinamen im Zugriff...

Vielleicht solltest du erstmal versuchen diese Vorschläge umzusetzen. :rolleyes:
 
Zurück