Announcement

Collapse
No announcement yet.

TextBox einlesen und als txt-Datei abspeichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    also schlussendlich wäre es so richtig oder?

    Code:
    string tb_codeT = tb_code.Text;
    string date = DateTime.Now.ToString("yyyyMMddHHmmss");
    StreamWriter myWriter = File.CreateText(@"C:\portables\" + date + ".txt");
    myWriter.WriteLine(tb_codeT);
    myWriter.Close();

    Comment


    • #17
      Ich würde für den Streamwriter noch einen using-Block verwenden. Dann wird der Stream garantiert(auch im Fehlerfall) immer geschlossen.

      Also

      Code:
      using(StreamWriter myWriter = File.CreateText(@"C:\portables\" + date + ".txt"))
      {
          myWriter.WriteLine(tb_codeT);
      }

      Comment


      • #18
        ich habs mitlerweile über nen try-catch block in einem if-block.

        If Block zur Überprüfung, ob Ordner vorhanden ist; try-catch zum Ordner anlegen inkl. Fehlermeldung, wenn Berechtigungen fehlen.

        Ich hoff mal, dass meine Idee so korrekt ist ;-) funktionieren tut sie mal so, wie ichs möchte...

        Comment


        • #19
          try-catch block
          Wenn du try-finally meinst wäre das vermutlich äquivalent. Bei nur try-catch hast du vermutlich den Code zum Schließen des Streams zweimal was unschön wäre aber natürlich auch funktioniert.

          Comment


          • #20
            Nein, ich meinte schon try-catch.
            Bei catch soll er mir ja lediglich blos den Exception werfen.
            Da spielts doch keine Rolle, ob ich try-finally oder try-catch verwende oder?

            Comment


            • #21
              Zeig mal. Sonst denke ich die ganze Zeit an was anderes als du tatsächlich gemacht hast und wir reden fleißig aneinander vorbei.

              Comment


              • #22
                wird aber eh nochmal überarbeitet

                Code:
                                try
                                {
                                    Directory.CreateDirectory(@"C:\test");
                                    string tb_codeT = tb_code.Text;
                                    string date = DateTime.Now.ToString("yyyyMMdd_HHmmss");
                                    StreamWriter myWriter = File.CreateText(@"C:\test\" + date + ".txt");
                                    myWriter.WriteLine(tb_codeT);
                                    myWriter.Close();
                                }
                                catch (Exception)
                                {
                                    MessageBox.Show ("Ordner kann nicht angelegt werden");
                                }

                Comment


                • #23
                  Da hast du dann genau das Problem was ich angesprochen habe. Wenn du irgendwo im Code eine Exception hast springt der zwar in deinen catch aber eben auch an myWriter.Close() vorbei und deine eventuell vorhandene Datei wird nicht geschlossen. Und da du nach dem catch das Programm einfach weiterlaufen lässt kann irgendwas schlimmes als Folgefehler im Code passieren. Du solltest für den Streamwriter weiterhin einen using-Block benutzen damit der garantiert geschlossen wird.

                  Dein gezeigter Exceptionhandling code ist eigentlich immer falsch und macht mehr Probleme als du glaubst zu lösen. Hier verheimlichst du sogar das eigentliche Problem und zeigt immer die selbe Meldung an egal welches Problem vorliegt.

                  Wenn du nicht weiß wie du in einem Code konkret ein Problem lösen kannst(und nur MessageBox.Show ist keine Lösung) dann mach einfach kein Exceptionhandling sondern lass die Exception weiter hochbubbeln bis er schließlich im globalen Exceptionhandling landet. Dort wird er dann angezeigt und das Programm sicherheitshalber beendet.

                  Comment


                  • #24
                    also müsste ich den using ausserhalb von try-catch verwenden. Passieren kann ja auch nicht viel, außer dass die Datei nicht erzeugt oder bearbeitet wird oder?

                    Dein gezeigter Exceptionhandling code ist eigentlich immer falsch und macht mehr Probleme als du glaubst zu lösen. Hier verheimlichst du sogar das eigentliche Problem und zeigt immer die selbe Meldung an egal welches Problem vorliegt.
                    Die Fehlermeldung ist ja auch momentan nur so da, damit ich testen kann und weiß, wo ich die Meldung zuordnen kann.

                    ...lass die Exception weiter hochbubbeln bis er schließlich im globalen Exceptionhandling landet.
                    Das kapier ich nicht ganz. Wie bzw was meinst du mit hochbubbeln?

                    Comment


                    • #25
                      Das kapier ich nicht ganz. Wie bzw was meinst du mit hochbubbeln?
                      Ich meinte im Zweifel sollst du einfach nichts tun Die Exception wird dann solange den Stapel deiner Methodenaufrufe zurückfallen bis er einen sinnvollerer(hoffentlich) Exceptionhandler findet oder eben den globalen Exceptionhandler. Die Exception wird eh angezeigt das musst du nicht selbst machen im Exceptionhandler solltest du das Problem üblicherweise beheben nicht einfach anzeigen. Dazu finde ich es problematisch bei jedem Fehler einfach weiter zu machen. Es kann ja auch was schlimmeres passiert sein als du in deiner Meldung behauptest. Also konkrete Exceptions fangen und nicht einfach Exception und ein finally Block(oder eben using) benutzen um lokale Resourcen garantiert frei zugeben.

                      Beispiel.

                      [Highlight=C#]try
                      {
                      Directory.CreateDirectory(@"C:/test");
                      string tb_codeT = tb_code.Text;
                      string date = DateTime.Now.ToString("yyyyMMdd_HHmmss");
                      using(StreamWriter myWriter = File.CreateText(@"C:/test/" + date + ".txt"))
                      {
                      myWriter.WriteLine(tb_codeT);
                      }
                      }
                      catch (IOException e) // nur IO Exceptions fangen
                      {
                      MessageBox.Show ("Ordner kann nicht angelegt werden. Ursache:" + e.Message);
                      }
                      catch (UnauthorizedAccessException e) // nur Rechte Exceptions werden gefangen
                      {
                      MessageBox.Show ("Ordner kann nicht angelegt werden. Ursache:" + e.Message);
                      }
                      catch (Exception e) // denn ganzen Block kannst du auch weglassen
                      {
                      // Wenn du loggen oder doch anzeigen willst dann hier.
                      // Bei nicht näher spezifizierten Exception die aber mit throw immer weiterwerfen. Einfach weitermachen kann gefährlich sein.
                      throw;
                      }


                      [/Highlight]

                      Comment


                      • #26
                        Ich meinte im Zweifel sollst du einfach nichts tun
                        Ahso.. verwirr mich nicht so

                        Ok. Hab gestern wohl die using-Anweisung zu ungenau gelesen .. naja.. Jetzt weiß ich es ja ;-)

                        Ok, mit mehreren catches kann man das auch machen.
                        Ich dachte nur, dass es anfangs reicht, ne allgemeine Fehlermeldung anzuzeigen. Ich kann es dann ja immer noch ausbessern, wenn ich davon Wind bekomme (das Programm wird dann ja nur von einigen Privatanwendern - welche ich persönlich kenne - verwendet)

                        Aber so weiß ich auch jetzt schon, was ich bei meinem Code besser machen kann, damit es eher "professioneller" wirkt ;-)

                        Daher: Vielen Dank nochmal für die Hilfe!!

                        Werde im laufe des Tages nochmal einen neuen Eintrag erstellen über die Verschlüsselung. Vorausgesetzt, ich finde auch heute nichts, wie ich das am besten angehen könnte ;-)

                        Comment


                        • #27
                          Hallo,

                          habe nochmal ein Problem in einem anderen Projekt.
                          Ich kann den - in eine TextBox eingebenenen - Pfad nicht auslesen lassen.
                          Wenn ich den Code aber in eine eigene Klasse stecke, dann funktionierts. Ich möchte ihn aber ausserhalb haben, damit alle darauf zugreifen können.

                          Code:
                          namespace CopyMoveDeleteFiles
                          {
                              public partial class Form1 : Form
                              {
                                  string path01 = tb_von.Text;
                                  string path02 = tb_nach.Text;
                          
                                  //string path01 = @"C:\test";
                                  //string path02 = @"C:\files";
                          
                                  private void b_ok_Click(object sender, EventArgs e)
                                  ....
                          Fehlermeldung:
                          Ein Feldinitialisierer kann nicht auf das nicht statische Feld bzw. die nicht statische Methode oder Eigenschaft "CopyMoveDeleteFiles.Form1.tb_von" verweisen.

                          Comment


                          • #28
                            Es ist einfach sinnlos in einem Field Initializer (= tb_von.Text) ein Control zu verwenden. Hier wird der Text des Controls garantiert immer leer sein. Mal ganz abgesehen davon, dass das Control zu der Zeit bei der die Zuweisung passiert wahrscheinlich noch gar nicht mal angelegt ist.
                            Also einfach:
                            string path01 = "";

                            oder

                            string path01 = String.Empty;

                            Wenn der Pfad sowieso nur von Textboxen kommt dann kannst Du auch eine Property anlegen:

                            [highlight=c#]
                            private String Path01
                            {
                            get
                            {
                            // Hier könnte man evtl. den Text auch noch validieren und eine Exception werfen wenn kein gültiger Pfad eingegeben ist
                            return tb_von.Text;
                            }
                            }
                            [/highlight]

                            Comment


                            • #29
                              ah, vielen dank!!

                              Jetzt funktioniert mein Programm einwandfrei (naja.. nicht ganz, hab noch ein paar fehler entdeckt ;-) muss noch weiter rumexperimentieren)

                              Comment

                              Working...
                              X