Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
Path.Combine("logs""Log.txt");					

oder eben (bei einer Windowsanwendung)
ausblenden C#-Quelltext
1:
"logs/Log.txt"					


Gruß

PS: Denke daran, dass du evtl. das Unterverzeichnis 'logs' erstellen musst.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
FileInfo logFile = new FileInfo("logs/Log.txt");

logFile.Directory.Create();

logFile.Create();
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 19.04.10 11:05 
Super, das hat geklappt.

Thx
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
Environment.GetFolderPath(Environment.SpecialFolder.System)					
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mo 19.04.10 11:40 
Unter Benutzung eines von Daniels Vorschlägen:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Mo 19.04.10 11:56 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 19.04.10 12:23 
Nein, anscheinend nicht mehr: blogs.msdn.com/cjack...f-program-files.aspx. Die Comments sind unterhaltsam ;) .

_________________
>λ=
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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:
ausblenden 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("TZM_Fehler.txt", FileMode.Append); //so war es vorher
            wFile = new FileStream(Application.ExecutablePath+"TZM_Fehler.txt", FileMode.Append); //so?
            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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 19.04.10 13:04 
Die MSDN hilfe findest du hier :D

Ist zur Zeit meine Lieblingsseite ;)

Gruß
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Mo 19.04.10 13:13 
user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
Die MSDN hilfe findest du hier :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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).

user profile iconchip777 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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() /*, Encoding.ASCII */);
    }

Oder je nach Geschmack (und .NET-Version) auch
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Di 20.04.10 08:22 
Super,

jetzt funktioniert es und der Code ist übersichtlich aufgebaut.
Außerdem verständlich.
Danke.