2016-03-31 36 views
5

Chcę tworzyć dzienniki dla działań różnicowych. Każdego dnia tworzę nowy plik z datą jako nazwą pliku. Teraz, jeśli katalog nie istnieje, chcę, aby system zrobił dla mnie katalog. Szukałem tego tematu, a wszystkie odpowiedzi dotyczą tego samego: użyj Directory.CreateDirectory(FilePath);. Jednak to nie wydaje się działać. Być może brakuje czegoś oczywistego.Utwórz katalog, jeśli nie istnieje

Oto kod: Komunikat

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(); 
      } 
     } 
    } 

Błąd:

Wyjątek typu '' wystąpił System.IO.DirectoryNotFoundException w pliku mscorlib.dll ale nie było obsługiwane w kodzie użytkownika

Dodatkowe informacje: Nie można znaleźć części ścieżki "C: \ Users \ *** \ Source \ Repos \ Project \ ProjectName \ Logs \ WZCLogs \ 31032016.txt".

+0

Komunikat o błędzie lub opis? –

+2

Czy próbowałeś podać absolutną ścieżkę do utworzenia katalogu? Ponadto, jeśli użyjesz 'Path.Combine' do łączenia ścieżek, nie musisz się martwić o znaki separatora katalogu. –

+0

Zmienna FilePath nie jest kompletna prawdopodobnie? –

Odpowiedz

7

Folder może zostać utworzony w twoim C:\ (domyślny dysk, na którym jest zainstalowany system operacyjny). lokalizacja folderu to C:\Logs\WZCLogs\. możesz potwierdzić, że folder jest tworzony gdzieś w napędzie, ponownie wykonując kod, tym razem if (!Directory.Exists(FilePath)) zwraca true. Ponieważ nie określono żadnej lokalizacji, kompilator zakłada So. Sprawdź, czy został utworzony, czy nie;

można wydłużyć spróbować jak to:

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

Jeśli ścieżka jest źle zdecydowanie jeden wyjątek zostanie rzucony; Próbowałem z „X: \ próbki”, która daje mi wyjątek:

nie można odnaleźć części ścieżki „X: \ próbki

Gdzie jakby Próbowałem z Logs\WZCLogs która przyzwyczajenie dać każdy wyjątek po raz pierwszy, a także pominąć, jeśli po raz drugi; Stąd odkryłem, że folder jest tworzony gdzie indziej;

Można wprowadzić te zmiany, aby działały:

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

To rozwiązało mój problem dzięki. Zmieniono 'Directory.CreateDirectory();' na 'Directory.CreateDirectory (HostingEnvironment.ApplicationPhysicalPath + FilePath);' – ckindt

+1

// Tworzy wszystkie katalogi i podkatalogi w podanej ścieżce, chyba że już istnieją. publiczny statyczny DirectoryInfo CreateDirectory (ścieżka tekstowa); –

3

Musisz użyć ścieżki bezwzględnej podczas tworzenia katalogu. Spróbuj wykonać następujące czynności:

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(); 
    } 
} 

Nie trzeba sprawdzić, czy katalog istnieje najpierw jako metoda CreateDirectory nie ma skutków ubocznych, jeśli katalog jest już obecny. Dobrą praktyką jest także używanie Path.Combine zamiast łączenia łańcuchów bezpośrednio, ale upewnij się, że drugi parametr nie zaczyna się od ukośnika.

Można również uprościć kod przy użyciu metody File.AppendAllText zamiast tworzyć FileStream.

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

Działa jak urok, dzięki za uproszczenie mojego kodu. – ckindt