Autor |
Beitrag |
Xardas220
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 07.08.14 00:42
Hi Leute,
ich habe ein Problem an dem ich schon den ganzen lieben langen Tag arbeite und versuche es zu lösen, aber ohne Erfolg. Ich habe immer wieder gegooglet, aber so langsam gehen mir die Suchbegriffe aus.. :/ Scheinbar hat NIEMAND ein solches Problem wie ich es habe. -.- Naja.
Ich möchte, wie es die Überschrift eigentlich auch schon sagt, in einem Streamwriter-Pfad eine Variable angeben. Bedeutet, dass ich in einem WPF-Fenster eine Textbox habe, in die man einen Namen für den neu zu erstellenden Ordner eingeben muss:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| public partial class Savegame : Window { string txt1v = string.Empty;
public Savegame() { InitializeComponent(); }
private void btn1_Click(object sender, RoutedEventArgs e) { DirectoryInfo Savegame = Directory.CreateDirectory(txt1v);
this.Visibility = Visibility.Hidden; }
private void txt1_TextChanged(object sender, TextChangedEventArgs e) { txt1v = txt1.Text; } } |
Danach rufe ich diesen Inhalt in einem anderen WPF-Fenster auf und weise dem eine String-Variable zu. Nun müsste ich doch eigentlich, um den Inhalt in eine TXT-Datei zu speichern, es so "formulieren" können:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| string pfad2 = savegame1.txt1.Text; string pfad3 = "..\\Ueberschriften.txt";
string pfadgesamt = System.IO.Path.Combine (pfad2, pfad3);
using (StreamWriter myFile = new StreamWriter(pfadgesamt)) { myFile.Write(txt1v + Environment.NewLine); myFile.Write(txt2v + Environment.NewLine); myFile.Write(txt3v + Environment.NewLine); myFile.Write(txt4v + Environment.NewLine); myFile.Write(txt5v + Environment.NewLine); myFile.Close(); } |
Es funktioniert aber vorne und hinten nicht... :/ Es soll einfach nur die Textdatei in den vorher neu erstellten Ordner speichern, mehr nicht. Dieser Ordner soll sich dann in dem gleichen Verzeichnis wie später das Programm befinden, sprich die .exe-Datei.
Danke für Eure Hilfe schonmal im Voraus.
lg,
Leon
|
|
Yankyy02
      
Beiträge: 138
Erhaltene Danke: 21
Win 11 x64
C# (VS 2022 - Rider)
|
Verfasst: Do 07.08.14 01:21
Hallo Xardas220 and
Was funktioniert denn nicht? Welche Exception bekommst du?
Schau dir mal im Debugger deine >>pfadgesamt<< Variable an!
MfG
_________________ the quiter you become, the more you are able to hear
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Do 07.08.14 01:38
Die Path.Combine-Methode macht im Prinzip nichts anderes, als die Pfad-Teile aneinander zu hängen, getrennt durch das jeweilige gültige Trennzeichen.
Der unterscheidet auch nicht, was er da ran hängt, ob Dateiname, Pfad, oder Dateiendung. Es wird auch nicht im Nachhinein geprüft, ob der Pfad gültig ist.
In deinem Fall würde der Pfad daher ungefähr so aus sehen:
Quelltext 1:
| C:\So\Ein\Schöner\Pfad\..\Ueberschriften.txt |
Nimm die zwei Punkte und den Backslash vor dem Dateinamen raus und es sollte funktionieren, voraus gesetzt, die Datei existiert.
Wenn der Streamwriter eine nicht existierende Datei erstellt, dann geht alles gut, aber ich glaube, das macht der nicht.
By the way:
Streamwriter hat eine WriteLine-Methode, die tut genau das, was du mit Environment.NewLine tust.
|
|
Xardas220 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 07.08.14 20:18
Yankyy02 hat folgendes geschrieben : | Hallo Xardas220 and
Was funktioniert denn nicht? Welche Exception bekommst du?
Schau dir mal im Debugger deine >>pfadgesamt<< Variable an!
MfG |
Hey, danke für den Tipp, wollte erst einmal gucken, welchen Wert meine Variable "pfadgesamt" jetzt hätte, habe aber in ganz Visual Studio (Ultimate) vergeblich nach der Funktion QuickWatch gesucht, ich weiß einfach nicht, wie ich was, wo aktivieren muss, ich bräuchte nur Hilfe, wo ich diese Funktion zum überwachen des Variablen-Wertes finde.. :/ Danke!
btw: Ich bekomme keine Fehlermeldung oder sonstiges, die .txt-Datei wird einfach nicht gespeichert. Sie taucht nicht im Programm-Ordner auf und auch nicht im Savegame-Ordner, als wenn sie nie gespeichert wurde...
Palladin007 hat folgendes geschrieben : | Die Path.Combine-Methode macht im Prinzip nichts anderes, als die Pfad-Teile aneinander zu hängen, getrennt durch das jeweilige gültige Trennzeichen.
Der unterscheidet auch nicht, was er da ran hängt, ob Dateiname, Pfad, oder Dateiendung. Es wird auch nicht im Nachhinein geprüft, ob der Pfad gültig ist.
In deinem Fall würde der Pfad daher ungefähr so aus sehen:
...
Nimm die zwei Punkte und den Backslash vor dem Dateinamen raus und es sollte funktionieren, voraus gesetzt, die Datei existiert.
Wenn der Streamwriter eine nicht existierende Datei erstellt, dann geht alles gut, aber ich glaube, das macht der nicht.
By the way:
Streamwriter hat eine WriteLine-Methode, die tut genau das, was du mit Environment.NewLine tust.
|
Hi,
habe es die Punkte und den Backslash entfernt, aber nun wird die .txt-Datei im Programm-Ordner gespeichert und nicht im Savegame-Ordner.. :/
lg,
Leon
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 07.08.14 20:46
Da du .. im Pfad hast, also das Symbol für den Parentordner, solltest du auch im Parentordner schauen ob da was auftaucht.
Im Beispiel von Paladin007 also 'C:\So\Ein\Schöner\Pfad\..\Ueberschriften.txt' läge die Ueberschriften.txt in 'Schöner'.
Zitat: | wo ich diese Funktion zum überwachen des Variablen-Wertes finde. |
Die Möglichkeiten die mir gerade einfallen
- Autos Ctrl+Alt+V,A (alle automatischen Variablen)
- Locals Ctrl+Alt+V,L (alle lokalen Variablen)
- Quickwatch Shift+F9 (wenn Cursor auf entsprechender Variablen)
- Watch Ctrl+Alt+W, 1 (oder 2,3,4 davon gibts mehrere, frei festlegbare Watchliste)
- Pin To Source (Contextmenü einer Variablen, zeigt ständigen Hint mit aktuellem Variablenwert an)
- Immediate Window Ctrl+Alt+I (Console Fenster, einfach Variablennamen eintippen oder sonstigen auszuwertenden Ausdruck)
Alle aber natürlich auch im Contextmenü des Editors oder im Menü unter Debug/Windows zu finden.
|
|
Xardas220 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 07.08.14 22:02
Ralf Jansen hat folgendes geschrieben : | Da du .. im Pfad hast, also das Symbol für den Parentordner, solltest du auch im Parentordner schauen ob da was auftaucht.
Im Beispiel von Paladin007 also 'C:\So\Ein\Schöner\Pfad\..\Ueberschriften.txt' läge die Ueberschriften.txt in 'Schöner'.
Zitat: | wo ich diese Funktion zum überwachen des Variablen-Wertes finde. |
Die Möglichkeiten die mir gerade einfallen
- Autos Ctrl+Alt+V,A (alle automatischen Variablen)
- Locals Ctrl+Alt+V,L (alle lokalen Variablen)
- Quickwatch Shift+F9 (wenn Cursor auf entsprechender Variablen)
- Watch Ctrl+Alt+W, 1 (oder 2,3,4 davon gibts mehrere, frei festlegbare Watchliste)
- Pin To Source (Contextmenü einer Variablen, zeigt ständigen Hint mit aktuellem Variablenwert an)
- Immediate Window Ctrl+Alt+I (Console Fenster, einfach Variablennamen eintippen oder sonstigen auszuwertenden Ausdruck)
Alle aber natürlich auch im Contextmenü des Editors oder im Menü unter Debug/Windows zu finden. |
Hi und danke für deine Antwort, aber die Möglichkeiten die du mir aufgelistet hast, gehen alle nicht...  Ich weiß nicht warum, ich habe mich mal ein wenig schlau gemacht via Google, aber ich habe die QuickWatch-Funktion nicht in meiner Visual Studio 2012 Version dabei. Ich weiß nicht wie das angehen kann, aber ich kann es unter dem Reitr "Debuggen" nicht auswählen. Sowohl als auch nicht während aktivem Debug-Modus oder "Source-Code-änder-Modus".
Ich habe auch schon versucht, während des debuggens versteht sich, die "pfadgesamt"-Variable allein in "Überwachen 1" zu packen, geht aber auch nicht, da das Feld "Überwachung hinzufügen" aus dem Kontextmenu ausgegraut ist. Ich habe schon versucht den Curser einfach im Namen der Variable zu lassen, sie zu markieren oder die ganze Code-Zeile zu markieren, ging aber alles nicht, immer ausgegraut.
Was ich komplett komisch finde ist eben die Tatsache, dass ich QuickWatch nicht aktivieren kann, es noch nicht einmal unter den Einstellungen im "Keyboard"-Unterpunkt von "Umgebung" im Suchfeld unter Debug.QuickWatch finden konnte. Tastaturzuordnungsschema natürlich auf "Standart" gestellt...
Komplett kurios.. :/
lg,
Leon
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 08.08.14 09:36
Hallo Xardas220,
du mußt erst einen Haltepunkt (breakpoint) mit der Taste F9 gesetzt haben (und das Programm dann bis dahin laufen - und anhalten - lassen), damit du die Debug-Fenster benutzen kannst, s.a. [Artikel] Debugger: Wie verwende ich den von Visual Studio?
|
|
Xardas220 
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 08.08.14 13:50
Danke!  Man, man, man, dass ich wirklich so blöde war.. :/ Sorry dafür. Habe es nun mal nachgeschaut und der Pfad besteht nur aus "Ueberschrift.txt", heißt keine Ordnerstruktur wird mitgeliefert und somit wird die Text-Datei im Programmordner selbst gespeichert. :/
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Xardas220 am Fr 08.08.14 13:57, insgesamt 1-mal bearbeitet
|
|
Xardas220 
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 08.08.14 13:55
So, habe noch etwas rausgefunden.. pfad1 steht auf "", bedeutet dass er den Pfad quasi mit nichts kombiniert, kann ja auch nicht funktionieren.. -.- Jetzt muss ich noch den Fehler finden, weil ja einfach nur der Text aus der Textbox vom WPF-Fenster "savegame1" verwendet wird. Das Fenster wird danach ja auch nicht geschlossen, sondern nur versteckt und bleibt im Hintergrund, aber trotzdem kann nichts mehr ausgelesen werden, komisch eigentlich.. O.o
Es wird irgendwie immer komischer.. Sollte ich vielleicht mein Programm, also Visual Studio mal neuinstallieren? -.- (siehe Bild)
Einloggen, um Attachments anzusehen!
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 08.08.14 15:05
Was soll der Umweg über die txtsavev Variablen? Ist den die Instanz des Fensters die du debuggst auch die die angezeigt wird und wo die Textbox somit auch gefüllt sein könnte?
Zitat: | Sollte ich vielleicht mein Programm, also Visual Studio mal neuinstallieren? -.- (siehe Bild) |
Egal wie gut der Mann vor dem Visual Studio ist die Wahrscheinlichkeit das es nicht an der Person davor liegt ist verschwindend gering.
|
|
avoid
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Fr 08.08.14 23:09
ich hab mir jetzt nicht die mühe gemacht durch zu lesen was meine Vorredner geschrieben haben aber warum nicht einfach so machen?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void button2_Click_1(object sender, EventArgs e) { saveFileDialog1.Filter = "Textdatei (*.txt)|*.txt|Alle Dateien|*.*"; saveFileDialog1.ShowDialog(); string dateipfad = saveFileDialog1.FileName; try { StreamWriter sw = new StreamWriter(dateipfad); sw.Write("Sensor Daten:\r\n" + textBox1.Text + "\r\n\r\nRC Daten:\r\n" + textBox2.Text); sw.Close(); } catch { } } |
das ist ein Beispiel mit dem ich den Inhalt zweier TextBoxen speichere.
dazu verwende ich einen saveFileDialog in dem ich Pfad und Name angeben kann.
willst du das ohne den Dialog machen dann geht das wie folgt:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void button2_Click_1(object sender, EventArgs e) { string dateipfad = Application.StartupPath + "\\" + textBox_NeuerOrdner.Text + "\\save.txt"; if (File.Exists(dateipfad)) { } else { try { StreamWriter sw = new StreamWriter(dateipfad); sw.Write("Sensor Daten:\r\n" + textBox1.Text + "\r\n\r\nRC Daten:\r\n" + textBox2.Text); sw.Close(); } catch { } } } |
wie du Daten von einer form an die andere weiter gibst ist dir ja bekannt denke ich.
wenn du noch fragen dazu hast frag ruhig.
---nachtrag---
wenn du willst das deine Anwendung sich den einmal ausgewählten Pfad merkt.
verwende die Settings:
C#-Quelltext 1:
| Settings setting = new Settings(); |
das erleichtert das arbeiten etwas wenn man den Pfad immer wieder braucht.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Sa 09.08.14 01:01
Avoid, ein bisschen muss ich aber kritisieren:
Du solltest Path.Combine verwenden, das sorgt gleich noch dafür, dass das korrekte Trennzeichen eingesetzt wird.
Bitte lasse Exceptions nicht ins Leere laufen. Der User erwartet die Ausführung der angeforderten Funktion und sollte dann mindestens irgendwo eine Meldung erhalten. Das macht auch die Fehlersuche leichter.
Du solltest using verwenden, dann wird am Ende auch bei einer Exception Dispose aufgerufen. Im Fall von StreamWriter ist der Inhalt der Methoden Close und Dispose identisch. Für sowas lohnt im Übrigen immer ein Blick in den Source-Code: referencesource.microsoft.com/
Ich habe mal etwas überarbeitet, wie ich diese Methode nach den mir beigebrachten Clean-Code-Regeln schreiben würde:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| private void button2_Click_1(object sender, EventArgs e) { var filePath = Path.Combine(Application.StartupPath, textBox_NeuerOrdner.Text, "save.txt");
if (File.Exists(filePath)) { } else { try { using (var fileWriter = new StreamWriter(filePath)) { fileWriter.WriteLine("Sensor Daten:"); fileWriter.WriteLine(textBox1.Text); fileWriter.WriteLine(); fileWriter.WriteLine("RC Daten:"); fileWriter.WriteLine(textBox2.Text); } } catch (Exception ex) { } } } |
Je nach Anwendungsfall sieht besonders das Exception-Handling anders aus.
So kann es z.B. sein, dass eine Reihe Features an einem zentralen Punkt angestoßen werden. Dort werden dann auch Exceptions abgefangen und z.B. in eine Datei geschrieben, welche dann wiederum vom User an den Entwickler zur Fehlersuche geschickt werden kann.
Alle anderen Exceptions, die keinen tatsächlichen Programmierfehler darstellen, sollten vorher abgefangen werden.
|
|
avoid
      
Beiträge: 230
Erhaltene Danke: 4
MSDos, WinXP32, Win764, Win10, Android, Debian
msl (mIRC edit), html & php & Java (DreamweaverMX), Basic (picaxe PE6), C (Arduino IDE), C# (vs2010,2015,2017,2019,Unity,Android Studio)
|
Verfasst: Sa 09.08.14 08:30
dein code ist schön clear, gefällt mir.
weise aber auch darauf hin das Path.Combine für Anfänger gewisse Fußangeln beinhaltet.
Beispiel: Nicht alle für Verzeichnis- und Dateinamen ungültigen Zeichen werden von der Combine-Methode als nicht akzeptabel interpretiert.
genaueres gibt's ja bei MSDN.
ich bleibe für mich selbst, in der Regel beim saveFileDialog.
_________________ Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
|
|
Palladin007
      
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Sa 09.08.14 16:26
Der Tipp mit Path.Combine ist gut, wusste ich so noch gar nicht.
Schade, dass es da keine Option für gibt, das fest zu legen.
Den SaveFileDialog finde ich persönlich auch besser, schon alleine für den User, weil es einfach angenehmer zu bedinenen ist.
Aber auch hier sollte using für alle Objekte verwendet werden, die IDisposible implementieren.
Und wenn es eine WriteLine-Methode gibt, sollte Diese auch verwendet werden. ^^
Allgemein sollten die Features vom .NET-Framework verwendet werden, wenn es etwas passendes gibt oder zumindest vorhandene Klassen so angepasst, dass sie für die Anforderung genügen.
Einfach deshalb, weil man sich in der Regel darauf verlassen kann, dass da keine Bugs drin sind.
Klar gibt es auch irgendwo im .NET-Framwork Bugs, aber es wird einfach so umfangreich getestet und von Microsoft korrigiert.
Eigenlösungen haben den Vorteil nicht, daher suche ich lieber erst nach einer Lösung bei Google, falls es möglicherweise eine vorhandene Lösung gibt, auch wenn es kein Aufwand wäre, selber eine zu schreiben.
|
|
|