C# StreamWriter in SafeFileDialog einfügen



  • Hallo, ich hoffe es kann mir jemand weiterhelfen. Ich arbeite an einem vorgeschriebenem Programm dass eine Textdatei in einen vorgegeben Ordner speichert. Nun habe ich ein SafeFileDialog eingerichtet und frage mich wie ich alle Daten dort einfügen kann um sie abzuspeichern(bis jetzt wird nur eine leere Textdatei erstellt).Ich arbeite it folgendem Code:

    System.IO.StreamWriter sw = new System.IO.StreamWriter(Meldung.TB_Anwendung.Text + ".txt");

    sw.WriteLine(LB_A.Text);
    sw.WriteLine();
    sw.WriteLine(LB_A1.Text + " " + CB_A1.Text);

    ...
    sw.WriteLine();

    foreach (DictionaryEntry elem in Details) sw.WriteLine(" {0} \n {1} ", elem.Key, elem.Value);

    sw.Close();

    Und der FileStreamDialog:

    private void Btn_Anwendung_Click(object sender, EventArgs e)
    {
    {

    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    saveFileDialog1.Filter = "Text files (.txt)|.txt|All files (.)|.";
    saveFileDialog1.Title = "Save an Text File";
    saveFileDialog1.ShowDialog();

    if (saveFileDialog1.FileName != "")
    {

    System.IO.FileStream fs =(System.IO.FileStream)saveFileDialog1.OpenFile();

    switch (saveFileDialog1.FilterIndex)
    {
    }

    fs.Close();
    }

    Nun meine Frage: Wie kann ich die beiden Sachen verbinden das alle Daten unter dem SaveFileDialog gespeichert werden. Ich hoffe ich hab es einigermaßen verständlich formuliert. Vielen Dank im voraus!!!



  • John20 schrieb:

    Ich hoffe ich hab es einigermaßen verständlich formuliert. Vielen Dank im voraus!!!

    Nee, ich hab gar nichts verstanden?



  • Dem Konstruktor von StreamWriter übergibst Du einfach den Pfad in saveFileDialog1.FileName.



  • Ich weiß ja nicht genau was du meinst, aber wenn ich dich richtig verstehe brauchst du sowas wie:

    using System.IO;
    
    FolderBrowserDialog myDialog = new FolderBrowserDialog();
    myDialog.Description = "Ziel verzeichnis wählen...";
    if (myDialog.ShowDialog() == DialogResult.OK)
    {
        foreach (string file in filelist)
            File.Copy(file, Path.Combine(myDialog.SelectedPath, Path.GetFilename(file)));
    }
    

    Ich weiß natürlich nicht ob dir die Dateien jetzt als Liste der Dateinamen vorliegen oder sonst was. Oder ist es nur eine Datei?? Dann:

    using System.IO;
    
    SaveFileDialog myDialog = new SaveFileDialog();
    myDialog.Title = "Datei speichern...";
    if (myDialog.ShowDialog() == DialogResult.OK)
    {
        File.Copy(<filename>, Path.Combine(myDialog.SelectedPath, Path.GetFilename(<filename>)));
    }
    

    Oder existiert die Datei als String vorhanden?

    using System.IO;
    
    SaveFileDialog myDialog = new SaveFileDialog();
    myDialog.Title = "Datei speichern...";
    if (myDialog.ShowDialog() == DialogResult.OK)
    {
        File.WriteAllText(<filename>, <content>);
    }
    

    Wenns unbedingt der StreamWriter sein muss:

    foreach (string line in <content>.Split('\n'))
    {
        SW.WriteLine(line);
    }
    // oder viel einfacher:
    SW.Write(<content>);
    
    // für beide wider:
    SW.Close();
    

    Noch besser: StreamWriter einfach in using Block.
    Man kann die verschiedenen Varianten ja dann nach belieben kombinieren. 🙂

    Wenn die gewünschte Lösung nicht dabei ist, könnte es vielleicht sein, dass du dich eventuell ganz leicht unvertsändlich ausgedrückt hast. 😉 😃



  • Sorry für die unverständliche Ausdrucksweise aber ich bin leider noch blutiger
    Anfänger^^. Bin leider immernoch nicht weiter gekommen 😞 . Der SafeFileDialog funktioniert soweit bis auf dass die gespeicherte Datei immer leer ist. Die Daten die ich darin einfügen will sind wie folgt angelegt:

    Details.Add("B Allgemeines ", "");

    if (Allgemein.RB_B1L.Checked)
    {
    Details.Add(Allgemein.LB_B1.Text, Allgemein.RB_B1L.Text);
    }
    else if (Allgemein.RB_B1W.Checked)
    {
    Details.Add(Allgemein.LB_B1.Text, Allgemein.RB_B1W.Text);
    }
    else
    {
    Details.Add(Allgemein.LB_B1.Text, Allgemein.RB_B1B.Text);
    }

    und dann mit folgender Zeile zusammengefasst:

    foreach (DictionaryEntry elem in Details) ;

    Ich bekomme es aber nicht in den SafeFileDialog eingefügt. Ich wäre unendlich dankbar für weitere Hilfe 😃



  • Ich hab Dir oben bereits gesagt, was zu tun ist:

    µ schrieb:

    Dem Konstruktor von StreamWriter übergibst Du einfach den Pfad in saveFileDialog1.FileName.

    Du sollst Die Daten nicht in einen SaveFileDialog einfügen (Du hast echt null Ahnung was Du da tust, oder?) sondern in einen Stream (StreamWriter). Den öffnest Du wie Du es im allerersten Post getan hast, der korrekte Pfad für den Stream als Konstruktorargument steht in saveFileDialog1.FileName.

    Es ist mir völlig egal ob Du Anfänger bist. Wenn Du mit einer Lösung nichts anfangen kannst, musst Du Dich mit den Grundlagen beschäftigen statt direkt mit Winforms rumzufrickeln.



  • Codetags?

    Also.. Vielleicht erklarst du mal, wie du die Daten vorliegen hast?
    Als Dictionary?

    SaveDictionaryComtents(saveFileDialog.FileName, Details, "=");
    
    public void SaveDictionaryContents(string filename, Dictionary myDictionary, string KeyValueSeperatot)
    {
        using StreamWriter sw = new StreamWriter(filename)
        {
            foreach (DictionaryEntry e in myDictionary)
                sw.WriteLine(e + KeyValueSeperator + myDicionary[e]);
        }
        sw.Close();
    }
    

    Jetzt zum Verständnis. Der Open und SaveFile sowie der FolderBrowserDialog bieten lediglich Benutzersteuerelemente bzw. Schnittstellen, welche dem Benutzer ermöglichen einen Dateipfad und somit String nicht lediglich einzugeben, sondern auf Basis des Dateisystems des übergeordneten Computers auszuwählen. Das Auslesen sowie die Weiterverarbeitung dieses Strings liegt allein beim Autor des Programms.
    Du kannst den Dialog also nicht direkt mit einem StreamWriter verknüpfen, sondern lediglich den Stream-Inhalt in der Datei abspeichern, deren Pfad man zunächst im Dialog auswählen lässt und anschließend im Konstruktor des StreamWriters übergibt.



  • Vielleicht nochmal einfacher:

    Der Dialog kann gar nix. Er ist nur Eingabehilfe für den Benutzer und gibt seinem aufrufenden Code einen Pfad zurück.

    Deine Aufgabe ist es, diesen Pfad zum Speichern zu verwenden, z.B. so

    using (System.IO.StreamWriter sw = new System.IO.StreamWriter(thePathUserToldYouViaDialogue))
    {
        // eine der sw.Write()- oder sw.WriteLine()-Überladungen
    }
    

    Die Verwendung von using in diesem Kontext verhindert, dass der StreamWriter aus irgendeinem Grund offen bleiben könnte.

    Links:
    StreamWriter
    http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx
    using
    http://msdn.microsoft.com/en-us/library/yh598w02.aspx



  • Danke @luker.

    Ich glaube deine Version ist für einen Anfänger deutlich besser zu verstehen.. 🙂


Anmelden zum Antworten