2016-03-31 19 views
5

Desidero creare registri per azioni diverse. Creo un nuovo file ogni giorno con la data come nome del file. Ora, se la directory non esiste, voglio che il sistema faccia la directory per me. Ho cercato questo argomento e tutte le risposte arrivano alla stessa cosa: usa Directory.CreateDirectory(FilePath);. Tuttavia questo non sembra funzionare. Potrebbe mancare qualcosa di ovvio.Crea directory se non esiste

Ecco il codice: messaggio

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

Errore:

Un'eccezione di tipo 'System.IO.DirectoryNotFoundException' si è verificato in mscorlib.dll ma non è stata gestita nel codice utente

Ulteriori informazioni: Impossibile trovare una parte del percorso 'C: \ Users \ *** \ Source \ Repos \ Project \ ProjectName \ Logs \ WZCLogs \ 31032016.txt'.

+0

Messaggio di errore o descrizione? –

+2

Hai provato a dargli un percorso assoluto per la directory da creare? Inoltre, se usi 'Path.Combine' per combinare percorsi, non dovrai preoccuparti dei caratteri del separatore di directory. –

+0

la variabile FilePath non è completa probabilmente? –

risposta

7

La cartella potrebbe essere stata creata nell'unità C:\ (l'unità predefinita in cui è installato il sistema operativo). quella posizione della cartella è C:\Logs\WZCLogs\. puoi confermare che una cartella è stata creata da qualche parte nell'unità eseguendo nuovamente il codice, questa volta lo if (!Directory.Exists(FilePath)) restituisce true. Dal momento che non hai specificato alcuna posizione, il compilatore presume che sia così. Controlla se è stato creato o meno;

È possibile estendere il provare come non:

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

Se il percorso è uno sbagliato sarà gettato sicuramente un'eccezione; ho provato con "X: \ sample", che mi dà eccezione:

Impossibile trovare una parte del percorso 'X: \ sample

Dove, come se ho provato con Logs\WZCLogs che suole dare qualsiasi eccezione per la prima volta e salta anche se per la seconda volta; Quindi ho trovato che la cartella è stata creata da qualche altra parte;

È possibile apportare queste modifiche per farli funzionare:

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

Questo ha risolto il mio problema, grazie. Changed 'Directory.CreateDirectory();' a 'Directory.CreateDirectory (HostingEnvironment.ApplicationPhysicalPath + FilePath);' – ckindt

+1

// Crea tutte le directory e le sottodirectory nel percorso specificato, a meno che non esistano già. public static DirectoryInfo CreateDirectory (percorso stringa); –

3

È necessario utilizzare il percorso assoluto durante la creazione della directory. Provare quanto segue:

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

Non è necessario verificare se la directory esiste in primo luogo come il metodo CreateDirectory non ha effetti collaterali se la directory è già presente. È inoltre consigliabile utilizzare Path.Combine anziché concatenare direttamente le stringhe, ma assicurarsi che il secondo parametro non inizi con una barra.

È inoltre possibile semplificare il codice utilizzando il metodo File.AppendAllText anziché creare un 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

Funziona come un fascino, grazie per semplificare il mio codice. – ckindt