Entwickler-Ecke
IO, XML und Registry - Speicherort einer Datei vor erstem Progstart festlegen
chip777 - Mo 19.04.10 10:26
Titel: Speicherort einer Datei vor erstem Progstart festlegen
Hi,
ich habe in meinem Programm eine Methode eingebaut um auftretende Fehler in einer Datei zu speichern. Das klappt auch sehr gut, nun habe ich allerdings ein Problem. Im Moment habe ich den Pfad der FehlerlogDatei fest einprogrammiert, später wenn das Programm fertig ist, soll es allerdings so sein, dass die Fehlerdatei immer in dem Ordner liegt in dem die Exe Datei sich befindet die diese erstellt, also quasi mein Programm. Am besten in einem Unterordner namens Log-Dateien oder sowas in die Richtung.
Wie kann ich den Pfad bestimmen von dem aus meine Anwendung startet?
Btw. ich bedanke mich an dieser Stelle gleich mal bei allen die mir bisher geholfen haben, dieses Forum ist echt super.
Besonderen Dank an Norman,Jürgen und Daniel.
danielf - Mo 19.04.10 10:46
Bitteschön :)
Standardmäßig sind die Pfade bereits relativ zu deiner exe, es seiden es wird explizit ein anderes Arbeitsverzeichnis gesetzt. D.h. um im Normalfall deine Log Datei im gleichen Verzeichnis zu speichern genügt ein Pfad wie "Log.txt". Wenn du noch ein Unterordner haben willst, kannst du diesen einfach angeben: "logs/Log.txt" bzw. Plattformunabhängig: Path.Combine("logs", "Log.txt"); (auch möglich string.Concant("logs", Path.PathSeparator, "Log.txt"));
Tendieren würde ich aber klar zu:
C#-Quelltext
1:
| Path.Combine("logs", "Log.txt"); |
oder eben (bei einer Windowsanwendung)
Gruß
PS: Denke daran, dass du evtl. das Unterverzeichnis 'logs' erstellen musst.
C#-Quelltext
1: 2: 3: 4: 5:
| FileInfo logFile = new FileInfo("logs/Log.txt");
logFile.Directory.Create();
logFile.Create(); |
chip777 - Mo 19.04.10 11:05
Super, das hat geklappt.
Thx
JüTho - Mo 19.04.10 11:16
Auch wenn Daniel alles Relevante bereits erwähnt hat, muss ich noch ergänzen, dass ein normaler Anwender ab Vista im Programmverzeichnis keine Schreibrechte hat. Du solltest deshalb einen bestimmten Wert von Environment.SpecialFolder, vorzugsweise CommonApplicationData nutzen.
Gruß Jürgen
chip777 - Mo 19.04.10 11:31
Hi,
ich muss die Frage doch nochmal öffnen, leider ist es so das ich vorher einige Dateien öffne und speicher und meine Fehlerdatei demnach jetzt einfach dahin gespeichert wird wo ich die letzte Dateiopration ausgeführt habe.
Also muss ich jetzt doch den Speicherort bestimmen udn kann ihn nicht einfach als gegeben annehmen.
@Jürgen
kannst du das mit dem Environment.SpecialFolder nochmal etwas genauer erklären, dass mit den schreibrechten kann ich verstehen dass es da Probleme geben kann, aber wie helfen dann deine Befehle weiter?
JüTho - Mo 19.04.10 11:40
Unter Benutzung eines von Daniels Vorschlägen:
C#-Quelltext
1: 2: 3:
| string logfilepath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Logs.Txt" ); |
Jetzt ist mein Standardhinweis fällig: Schau in die SDK-Doku/MSDN/Hilfe, bei SpecialFolder gibt es den Hinweis auf GetFolderPath und dort das Beispiel.
Gruß Jürgen
@Daniel
Du warst diesmal aber faul: einfach das Beispiel aus der Doku zu kopieren. :D
Kha - Mo 19.04.10 11:44
Auch
CommonApplicationData ist ab Vista für normale Benutzer schreibgeschützt. Es kann höchstens von einem Installer ein Unterverzeichnis mit entsprechenden Berechtigungen angelegt werden.
chip777 hat folgendes geschrieben : |
ich muss die Frage doch nochmal öffnen, leider ist es so das ich vorher einige Dateien öffne und speicher und meine Fehlerdatei demnach jetzt einfach dahin gespeichert wird wo ich die letzte Dateiopration ausgeführt habe. |
Und deswegen
nie relative Pfade benutzen. Wenn du in das Verzeichnis der Exe speichern darfst, kannst du das ruhig so belassen, aber benutze über
Application.ExecutablePath einen absoluten Pfad.
JüTho - Mo 19.04.10 11:56
Kha hat folgendes geschrieben : |
Auch CommonApplicationData ist ab Vista für normale Benutzer schreibgeschützt. |
Gibt es denn kein gemeinsames Verzeichnis, das automatisch für alle Benutzer freigegeben ist? Jürgen
chip777 - Mo 19.04.10 12:24
Ich gehe einfach mal davon aus, dass ich in das Verzeichnis schreiben darf, in der sich die exe Datei befindet, damit ich überhaupt zu einer Lösung komme. Der Betreuer meines Praxissemesters hält das für ok.
Hier nun der Code meiner Fehlerlog-Datei:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| #region Fehler protkollieren private void protokollieren_der_Fehler(string Fehlerbeschreibung) { MessageBox.Show("Fehler aufgetreten, weitere Informationen finden Sie in der Logdatei."); DateTime dateTime = DateTime.Now; string datumHeute = ""+dateTime; System.IO.FileStream wFile; byte[] byteData = null; byte[] datum = null; byteData = Encoding.ASCII.GetBytes(""+Fehlerbeschreibung); datum = Encoding.ASCII.GetBytes(@" ******************************************************************************************************************************************************************************* "+datumHeute+@" "); wFile = new FileStream(Application.ExecutablePath+"TZM_Fehler.txt", FileMode.Append); wFile.Write(datum, 0, datum.Length); wFile.Write(byteData, 0, byteData.Length); wFile.Close(); } #endregion |
Allerdings heißt die Fehlerdatei dann: TZM.EXETZM_Fehler.txt
Wie kann ich das jetzt am besten bewerkstelligen das die nur noch TZM_Fehler.txt dasteht.
JüTho - Mo 19.04.10 12:36
Benutze gefälligst Path.Combine, wozu schlagen wir das denn vor?! Außerdem ist ExecutablePath die Exe selbst (Path ist in der Regel ein vollständiger Name), du willst StartupPath haben. Noch ein Grund für den Hinweis: Schau in die SDK-Doku.
Das Hin- und Herbasteln mit ASCII-Encoding finde ich auch ziemlich umständlich. Bist du sicher, dass du nur 7-bit-Texte haben willst (denn das bedeutet ASCII)? Mit String.Format bekommst du eine saubere Formatierung der Inhalte.
Der einfachste Weg wäre File.AppendAllText (da hast du, wenn nötig, auch eine Variante mit Encoding).
Jürgen
chip777 - Mo 19.04.10 12:54
Sry, ich hatte noch die alte Version kopiert, weil ich das in mehreren Forms verwende, Asche auf mein Haupt.
C#-Quelltext
1:
| wFile = new FileStream(Path.Combine(Application.StartupPath,"TZM_Fehler.txt"), FileMode.Append); |
So sollte die Zeile aussehen, danke für den Hinweis mit StartupPath.
Kannst du mir nochmal bisschen besser erklären wie ich den Text mit String.Format bzw. File.AppendAllText speichern kann?
Dieses Code Fragment, hatte mir jmd gegeben, für Verbesserungen wäre ich also dankbar.
und jetzt noch ne Frage, und bitte nicht hauen: wo finde ich die SDK-Doku, ein Link wäre nett.
Liebe Grüße,
Martin
chip777 - Mo 19.04.10 13:13
-.-
MSDN kenn ich, aber was hat das mit der SDK-Doku zu tun?
Oder ist das ein-und-dasselbe?
danielf - Mo 19.04.10 13:19
Ich würde sagen es ist ein und das Selbe, weil in MSDN ja alle Klassen, Properties und Methoden beschreibt. Aber vlt. kann Jürgen was dazu sagen.
Kha - Mo 19.04.10 15:45
So langsam sind wir komplett Off-Topic ;) : Das SDK und der Document Explorer dürften sich seit VS2010 gegessen haben, es gibt nur noch das MSDN (wahlweise direkt online oder offline gecacht und synchronisierbar).
chip777 hat folgendes geschrieben : |
Dieses Code Fragment, hatte mir jmd gegeben, für Verbesserungen wäre ich also dankbar. |
Der Code ist, gelinde gesagt, merkwürdig :| . Da gebe ich doch liebend gerne ein hoffentlich Gegenbeispiel:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| void LogError(string message) { MessageBox.Show("Fehler aufgetreten, weitere Informationen finden Sie in der Logdatei."); var builder = new StringBuilder(); builder.AppendLine(new string('*', 100)); builder.AppendLine(DateTime.Now.ToString()); builder.AppendLine(message); File.AppendAllText(Path.Combine(Application.StartupPath, "TZM_Fehler.txt"), builder.ToString() ); } |
Oder je nach Geschmack (und .NET-Version) auch
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| void LogError(string message) { MessageBox.Show("Fehler aufgetreten, weitere Informationen finden Sie in der Logdatei.");
File.AppendAllLines(Path.Combine(Application.StartupPath, "TZM_Fehler.txt"), new[] { new string('*', 100), DateTime.Now.ToString(), message } ); } |
chip777 - Di 20.04.10 08:22
Super,
jetzt funktioniert es und der Code ist übersichtlich aufgebaut.
Außerdem verständlich.
Danke.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!