2010-09-30 24 views
140

C'è qualcosa incorporato in System.IO.Path che mi dà solo il percorso file?Ottieni percorso completo senza nome file dal percorso che include il nome file

Per esempio, se ho un string

@ "c: \ webserver \ pubblici \ myCompany \ configs \ promo.xml",

Esiste un metodo BCL che darà me

"c: \ webserver \ public \ myCompany \ configs \"?

+5

possibile duplicato di [Come faccio ad avere la directory da percorso completo di un file?] (Http://stackoverflow.com/questions/674479/how-do-i-get-the- directory-da-un-file-percorso completo) – bluish

+0

FWIW: Ho "rinunciato" alla gestione dei "percorsi" del percorso e usiamo i nostri metodi con migliori aspettative e uniformità con UNC (provare a utilizzare GetDirectoryName su un Percorso UNC) e convenzioni (ad esempio trailing /). – user2864740

risposta

175

Path.GetDirectoryName() ... ma è necessario sapere che il percorso si passa ad esso contiene un nome di file; rimuove semplicemente il bit finale dal percorso, che si tratti di un nome di file o di una directory (in realtà non ha idea di quale).

Si potrebbe convalidare prima testando File.Exists() e/o Directory.Exists() sul vostro cammino per vedere se è necessario chiamare Path.GetDirectoryName

+2

Non è necessario chiamare 'File.Existe()'. In effetti, è piuttosto controproducente nel caso in cui il motivo per cui si trova il nome della directory sia crearlo se non esiste già. –

+2

Il suo esempio rileva esplicitamente un percorso con un nome di file. Se questo è lo schema dei percorsi che sta testando e se quei percorsi rappresentano file esistenti, il controllo di File.Exist() sicuramente sarebbe utile, non sarebbe d'accordo? Perché la situazione potrebbe essere altrimenti, ovviamente, stavo solo suggerendo che "poteva" usare i metodi Exists su File e/o Directory; ovviamente, come appropriato per la sua situazione. –

+0

Sì, un percorso con un nome file. Non c'è niente in questo per indicare che esiste un file, poiché i nomi dei file vengono prima. –

53
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 
+0

Questo è il migliore. Ricordare 'using System.IO;' per utilizzare i metodi del percorso –

45

Path.GetDirectoryName() restituisce il nome della directory, quindi per ciò che si vuole (con il trascinamento inverso carattere solidus) è possibile chiamare Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

+6

+1 The Path.DirectorySeparatorChar era utile – mack

4

ho usato questo e funziona bene:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName)); 

foreach (string file in filePaths) 
{ 
    if (comboBox1.SelectedItem.ToString() == "") 
    { 
     if (file.Contains("c")) 
     { 
      comboBox2.Items.Add(Path.GetFileName(file)); 
     } 
    } 
} 
4

Usa 'GetParent()', come illustrato, funziona bene. Aggiungi il controllo degli errori quando necessario.

var fn = openFileDialogSapTable.FileName; 
var currentPath = Path.GetFullPath(fn); 
currentPath = Directory.GetParent(currentPath).FullName; 
0
string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml"; 

    string currentDirectory = Path.GetDirectoryName(fileAndPath); 

    string fullPathOnly = Path.GetFullPath(currentDirectory); 
+2

Fornire alcune informazioni su come il codice sopra riportato risponde alla domanda per migliorare questa risposta. –

Problemi correlati