2016-03-31 21 views
5

Ich möchte Protokolle für unterschiedliche Aktionen erstellen. Ich erstelle jeden Tag eine neue Datei mit dem Datum als Dateiname. Nun, wenn das Verzeichnis nicht existiert, möchte ich, dass das System das Verzeichnis für mich erstellt. Ich habe nach diesem Thema gesucht und alle Antworten kommen zur selben Sache: Verwenden Sie Directory.CreateDirectory(FilePath);. Dies scheint jedoch nicht zu funktionieren. Könnte etwas offensichtlich fehlen.Verzeichnis erstellen, wenn nicht vorhanden

Hier ist der Code:

public class ElderlyHomeLog : ILog 
    { 
     private const string FilePath = "/Logs/WZCLogs/"; 
     public void MakeLog(string text) 
     { 
      if (!Directory.Exists(FilePath)) 
      { 
       Directory.CreateDirectory(FilePath); 
      } 
      string logFile = DateTime.Now.ToString("ddMMyyyy") + ".txt"; 
      if (!File.Exists(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile)) 
      { 
       FileStream f = File.Create(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile); 
       f.Close(); 
      } 

      using (StreamWriter sw = new StreamWriter(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile, true)) 
      { 
       sw.WriteLine(text); 
       sw.Close(); 
      } 
     } 
    } 

Fehlermeldung:

Eine Ausnahme vom Typ 'System.IO.DirectoryNotFoundException' in mscorlib.dll aufgetreten, wurde aber im Benutzercode nicht behandelt

Zusätzliche Informationen: Es wurde kein Teil des Pfads 'C: \ Benutzer \ *** \ Quelle \ Repos \ Projekt \ Projektname \ Logs \ WZCLogs \ 31032016.txt' gefunden.

+0

Fehlermeldung oder Beschreibung? –

+2

Haben Sie versucht, einen absoluten Pfad für das zu erstellende Verzeichnis anzugeben? Wenn Sie 'Path.Combine' verwenden, um Pfade zu kombinieren, müssen Sie sich keine Gedanken über Verzeichnistrennzeichen machen. –

+0

Die FilePath-Variable ist wahrscheinlich nicht vollständig? –

Antwort

7

Der Ordner kann in Ihrem C:\ (dem Standardlaufwerk, auf dem OS installiert ist) erstellt werden. Das ist der Speicherort des Ordners C:\Logs\WZCLogs\. Sie können bestätigen, dass ein Ordner irgendwo im Laufwerk erstellt wird, indem Sie den Code erneut ausführen, diesmal gibt if (!Directory.Exists(FilePath))true zurück. Da Sie keinen Speicherort angegeben haben, nimmt der Compiler So an. Überprüfen Sie, ob es erstellt wurde oder nicht;

Sie können die erweitern versuchen, So:

try 
    { 
    if (!Directory.Exists(FilePath)) 
     { 
      Directory.CreateDirectory(FilePath); 
     } 
    } 
catch (Exception ex) 
{ 
    // handle them here 
} 

Wenn der Pfad eine falsche ist definitiv eine Ausnahme ausgelöst wird; Ich habe mit „X: \ sample“ versucht, die mich Ausnahme gibt:

konnte nicht finden einen Teil des Weges ‚X: \ sample

Wo, wie, wenn ich mit Logs\WZCLogs denen versucht wird nicht geben jede Ausnahme zum ersten Mal und auch überspringen, wenn zum zweiten Mal; Daher habe ich festgestellt, dass der Ordner woanders erstellt wurde;

können Sie diese Änderungen vornehmen, um sie arbeiten:

string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs"); 
+0

Das löste mein Problem, danke. Changed 'Directory.CreateDirectory();' in 'Directory.CreateDirectory (HostingEnvironment.ApplicationPhysicalPath + FilePath);' – ckindt

+1

// Erstellt alle Verzeichnisse und Unterverzeichnisse im angegebenen Pfad, sofern sie nicht bereits existieren. public static DirectoryInfo CreateDirectory (Zeichenfolgenpfad); –

3

Sie müssen den absoluten Pfad verwenden, wenn Sie das Verzeichnis erstellen. Versuchen Sie Folgendes:

private const string FilePath = "Logs/WZCLogs/"; 

public void MakeLog(string text) 
{ 
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath); 
    Directory.CreateDirectory(directory); // no need to check if it exists 

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt"); 
    if (!File.Exists(logFile)) 
    { 
     FileStream f = File.Create(logFile); 
     f.Close(); 
    } 

    using (StreamWriter sw = new StreamWriter(logFile, true)) 
    { 
     sw.WriteLine(text); 
     sw.Close(); 
    } 
} 

Sie brauchen nicht zu prüfen, ob das Verzeichnis zuerst existiert als die CreateDirectory Verfahren keine Nebenwirkungen hat, wenn das Verzeichnis bereits vorhanden ist. Es ist auch eine gute Übung, Path.Combine anstelle von Verkettungen direkt zu verwenden, aber stellen Sie sicher, dass der zweite Parameter nicht mit einem Schrägstrich beginnt.

Sie können Ihren Code auch vereinfachen, indem Sie die File.AppendAllText-Methode verwenden, anstatt eine FileStream zu erstellen.

private const string FilePath = "Logs/WZCLogs/"; 

public void MakeLog(string text) 
{ 
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath); 
    Directory.CreateDirectory(directory); 

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt"); 
    File.AppendAllText(logFile, text + Environment.NewLine); 
} 
+0

Funktioniert wie ein Zauber, danke für die Vereinfachung meines Codes. – ckindt

Verwandte Themen