Ottieni il nome della cartella dal percorso completo del file


116

Come ottengo il nome della cartella dal percorso completo dell'applicazione?

Questo è il percorso del file di seguito,

c:\projects\root\wsdlproj\devlop\beta2\text

Qui "testo" è il nome della cartella.

Come posso ottenere il nome della cartella da questo percorso?

Risposte:


205

Vedere DirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;

Ciò non richiede che la cartella esista effettivamente nel file system (il nome della cartella sarebbe ancora "testo" per il percorso completo del file se la cartella "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" non lo fa ( attualmente) esistono nel file system)?
Peter Mortensen

@PeterMortensen, no. L'ho appena testato e il metodo restituisce il nome della cartella di livello più basso dalla stringa, anche se il percorso della cartella non esiste.
vbguyny

1
Grazie, ottima risposta. Ma sono un po 'perplesso che System.IO.Directory non supporti tale operazione.
anhoppe

1
@anhoppe - Sono d'accordo. Un'altra opzione che ho visto è Path.GetDirectoryName msdn.microsoft.com/en-us/library/... - ma non sarà in grado di verificare il lavoro svolto fino a domani.
Don Cheadle

30

Penso che tu voglia ottenere il nome della cartella principale dal percorso del file. È facile da ottenere. Un modo è creare un FileInfooggetto di tipo e utilizzare la sua Directoryproprietà.

Esempio:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;

16

Prova questo

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);

se hai un nome di file in una stringa, restituisce anche il nome del file
swissben

1
In questo caso, il testo è il nome del file (senza estensione). Pensavo fosse quello che voleva l'OP. Se è una cartella o un nome di file non ha importanza. Se la stringa non contiene il nome del file, questo codice gli darà ciò che sta cercando.
Øyvind Bråthen

4
A meno che i percorsi non finiscano con un \ come questo:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes

1
questo non funziona per una cartella. Ottengo una stringa vuota. Deve essere presente un file
BraveNewMath

3
Funziona perfettamente se il percorso della cartella non contiene una barra rovesciata finale (come ad esempio un percorso della cartella restituito da Path.GetDirectoryName () ). Il nome di quella funzione, GetFileName (), è un po 'fuorviante, però.
Peter Mortensen

9

Potresti usare questo:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();

cosa succede se il percorso è simile a questo: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", quindi con un DirectorySeparatorChar extra
Alex Pacurar

1
@Alex - Ho modificato il mio codice per farlo funzionare anche con quel tipo di percorsi. StringSplitOptions.RemoveEmptyEntriesfa il trucco.
Kristof Claes

Secondo msdn.microsoft.com/en-us/library/… , FileInfo può generare un'eccezione se non viene concessa l'autorizzazione richiesta.
Daniel B

5

Basta usare Path.GetFileName

Qui - Estrai il nome della cartella dal percorso completo di una cartella:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

Ecco alcuni extra: estrai il nome della cartella dal percorso completo di un file:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"

3

Ho pensato che non c'era altro modo se non entrare nel file system per scoprire se text.txt è una directory o solo un file. Se volevi qualcosa di semplice, forse puoi semplicemente usare:

s.Substring(s.LastIndexOf(@"\"));

1
Per evitare una barra all'inizio della stringa: s.Substring (s.LastIndexOf (@ "\") + 1);
David Yates

2

In questo caso il file che vuoi ottenere è memorizzato nella variabile strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;

2

Ecco un metodo alternativo che ha funzionato per me senza dover creare un oggetto DirectoryInfo. Il punto chiave è che GetFileName()funziona quando non ci sono barre finali nel percorso.

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

Esempio:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);

1

Anche questo può essere fatto in questo modo;

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

questo restituirà una stringa vuota
disklosr

@disklosr - appena testato con ScriptCs e restituisce "testo"
Steve Cooper

2
Funziona perfettamente se il percorso della cartella non contiene una barra rovesciata finale (come ad esempio un percorso della cartella restituito da Path.GetDirectoryName () ). Il nome di quella funzione, GetFileName (), è un po 'fuorviante, però.
Peter Mortensen

0

Basato su risposte precedenti (ma risolto)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

Spiegazione di GetFileNameda sorgente .NET :

Restituisce il nome e le parti dell'estensione del percorso specificato. La stringa risultante contiene i caratteri del percorso che seguono l'ultima barra rovesciata ("\"), barra ("/") o due punti (":") nel percorso. La stringa risultante è l'intero percorso se path non contiene barre rovesciate dopo aver rimosso le barre finali, i caratteri barra o due punti. La stringa risultante è null se path è null.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.