Autor |
Beitrag |
chip777
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mo 19.04.10 10:26
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
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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)
C#-Quelltext
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 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mo 19.04.10 11:05
Super, das hat geklappt.
Thx
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: 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?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 19.04.10 11:35
Environment.SpecialFolder ist ein Enum mit der man mit der Path-Klasse an eben spezielle Windowsordner wie zum Beispiel MyDocuments (Eigene Dateien) herankommst. Somit kannst du dein Log-File in diesem Ordner ablegen und brauchst keine Einschränkungen (auch bei Vista) befürchten.
C#-Quelltext 1:
| Environment.GetFolderPath(Environment.SpecialFolder.System) |
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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. 
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Mo 19.04.10 12:23
Nein, anscheinend nicht mehr: blogs.msdn.com/cjack...f-program-files.aspx. Die Comments sind unterhaltsam  .
_________________ >λ=
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: 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
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: 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 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: 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
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: Mo 19.04.10 13:04
Die MSDN hilfe findest du hier
Ist zur Zeit meine Lieblingsseite
Gruß
|
|
chip777 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Mo 19.04.10 13:13
danielf hat folgendes geschrieben : | Die MSDN hilfe findest du hier
Ist zur Zeit meine Lieblingsseite
Gruß |
-.-
MSDN kenn ich, aber was hat das mit der SDK-Doku zu tun?
Oder ist das ein-und-dasselbe?
|
|
danielf
      
Beiträge: 1012
Erhaltene Danke: 24
Windows XP
C#, Visual Studio
|
Verfasst: 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.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Mo 19.04.10 14:59
Siehe dort. Kurz gesagt: die Inhalte sind gleich; der Weg, wie man sie findet, unterscheidet sich. Jürgen
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 127
Win 7 Prof
C# VS 2008
|
Verfasst: Di 20.04.10 08:22
Super,
jetzt funktioniert es und der Code ist übersichtlich aufgebaut.
Außerdem verständlich.
Danke.
|
|