2015-05-22 19 views
5

Ho bisogno di ottenere il nome della directory dal suo percorso indipendentemente dal fatto che abbia una barra rovesciata finale. Ad esempio, l'utente può in ingresso uno dei seguenti 2 stringhe e ho bisogno il nome della directory logs:Ottieni il nome della directory dal percorso completo della directory indipendentemente dalla barra finale

"C:\Program Files (x86)\My Program\Logs" 
"C:\Program Files (x86)\My Program\Logs\" 

Nessuno dei seguenti dà risposta corretta ("Logs"):

Path.GetDirectoryName(m_logsDir); 
FileInfo(m_logsDir).Directory.Name; 

quanto pare analizzare la stringa di percorso e nel primo esempio decidere che Logs è un file mentre è davvero una directory.

Quindi dovrebbe controllare se l'ultima parola (Logs nel nostro caso) è davvero una directory; se sì, restituirlo, se no (Anche i log potrebbero essere un file), restituisce una directory genitore. Se fosse necessario occuparsi del filesystem effettivo piuttosto che analizzare la stringa stessa.

Esiste una funzione standard per farlo?

+1

Un file non ha bisogno di avere un'estensione –

+0

Può chiarire la tua domanda, vuoi per garantire la vostra afferrare il nome della cartella di registro o vuoi semplicemente la directory dei registri? – Greg

+0

Voglio ottenere "Log" ma assicurati che sia davvero la cartella e non un file. Il controllo di 'System.IO.Directory.Exists (m_logsDir)' sembra essere una soluzione fattibile. – dimnnv

risposta

2

Questo può aiutare

var result = System.IO.Directory.Exists(m_logsDir) ? 
       m_logsDir: 
       System.IO.Path.GetDirectoryName(m_logsDir); 
+0

Sembra meno efficiente della risposta che ho postato in cui è sufficiente controllare la bandiera – Voidpaw

+1

@dimnnv Nella domanda hai detto che la risposta corretta è "Log". La risposta accettata non restituisce quella –

0

Per questo abbiamo un frammento di codice lungo le linee di:

m_logsDir.HasFlag(FileAttribute.Directory); //.NET 4.0 

o

(File.GetAttributes(m_logsDir) & FileAttributes.Directory) == FileAttributes.Directory; // Before .NET 4.0 
0

Mi permetta di riformulare la mia risposta, perché si hanno due potenziali difetti da parte dei fattori distintivi. Se lo fai:

var additional = @"C:\Program Files (x86)\My Program\Logs\"; 
var path = Path.GetDirectoryName(additional); 

L'output sarà come previsto, Logs. Tuttavia, se si fa:

var additional = @"C:\Program Files (x86)\My Program\Logs"; 
var path = Path.GetDirectoryName(additional); 

L'output sarebbe My Program, che causa una differenza di uscita. Mi sia cercare di far rispettare il finale \ altrimenti si può essere in grado di fare qualcosa come questo:

var additional = @"C:\Program Files (x86)\My Program\Logs"; 
var filter = additional.Split('\\'); 
var getLast = filter.Last(i => !string.IsNullOrEmpty(i)); 

Speriamo che questo aiuta.

+1

Se non ci fosse un \ alla fine ciò restituirebbe "Il mio programma". – Ralf

+0

@Ralf Sì, è per questo che ho rivisto la mia risposta. – Greg

+0

Meglio ma ... Path non sa nulla del filesystem e parla solo di sintassi. E dimnv vuole distinguere tra file e directory, quindi DirectoryInfo è l'opzione migliore rispetto alla classe Path. – Ralf

5
new DirectoryInfo(m_logsDir).Name; 
+1

Questo funziona per i miei 2 esempi, ma cosa succede se i registri sono in realtà un file piuttosto che una directory? Farà un'eccezione? – dimnnv

+1

No, ma DirectoryInfo ha una proprietà esistente che è possibile controllare semplicemente. – Ralf

+0

Se "C: \ Programmi (x86) \ Il mio programma \ Log" è un file, 'new DirectoryInfo (m_logsDir) .Exists' restituisce false. Avrai una IOException se proverai a creare la directory ('new DirectoryInfo (m_logsDir) .Create();') –

Problemi correlati