Ottieni percorso completo senza nome file dal percorso che include nome file


198

C'è qualcosa incorporato System.IO.Pathche mi dà solo il percorso del file?

Ad esempio, se ho un string

@ "C: \ webserver \ public \ myCompany \ configs \ promo.xml",

c'è qualche metodo BCL che mi darà

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



FWIW: Ho "rinunciato" alla gestione dei "percorsi" da parte del Path e utilizziamo i nostri metodi con migliori aspettative e uniformità con UNC (prova a utilizzare GetDirectoryName su un percorso UNC) e convenzioni (ad es. Trailing /).
user2864740

A meno che non esista il file o la directory, non c'è modo di sapere se promo.xmldesigna un file o una directory con lo stesso nome. Questo è probabilmente il motivo per cui Path.GetDirectoryName()è implementato in modo così semplice e tronca solo l'ultimo segmento o rimuove la barra finale se ce n'è uno.
Abel

Risposte:


241

Path.GetDirectoryName()... ma devi sapere che il percorso che stai passando contiene un nome file; rimuove semplicemente il bit finale dal percorso, sia esso un nome file o un nome directory (in realtà non ha idea di quale).

Puoi validare prima testando File.Exists()e / o prima Directory.Exists()sul tuo percorso per vedere se devi chiamarePath.GetDirectoryName


2
Non è necessario chiamare File.Exists(). In effetti, è piuttosto controproducente nel caso in cui il motivo per trovare il nome della directory sia crearlo se non esiste già.
Jon Hanna,

3
Il suo esempio nota esplicitamente un percorso con un nome file. Se questo è lo schema dei percorsi che sta testando, e se quei percorsi rappresentano file esistenti, sarebbe sicuramente utile controllare File.Exists (), non saresti d'accordo? Poiché 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.
Andrew Barber,

Sì, un percorso con un nome file. Non c'è nulla in ciò per indicare che esiste un file, poiché i nomi dei file vengono per primi.
Jon Hanna,

4
Come ho detto; è un'opzione e può aiutare a seconda di ciò che si sa sul percorso. O potrebbe non essere affatto necessario. Ma testare File.Exists () e Directory.Exists () sullo stesso percorso è un modo rapido e semplice per sapere se un percorso, che esiste, è un file o una directory.
Andrew Barber,

5
come riferimento rapido, in ridondanza con la domanda e trattamento "ovvio", è necessario includerlo System.IOaffinché funzioni.
Cregox,

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

2
Questo è il migliore. Ricorda using System.IO;di utilizzare i metodi del percorso
Errore di sintassi il

Si noti che questo non include una barra finale (è banale aggiungerne una)
Mingwei Samuel

51

Path.GetDirectoryName()restituisce il nome della directory, quindi per quello che vuoi (con il carattere solidus inverso finale) potresti chiamare Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ webserver \ public \ myCompany \ configs

fullPathOnly: c: \ webserver \ public \ myCompany \ configs


6
Fornisci alcune informazioni su come il codice sopra risponde alla domanda al fine di migliorare questa risposta.
Eric Hauenstein,

1
Path.GetFullPath restituisce il percorso completo senza il nome file.
Kobie Williams,

mostrare l'output sarebbe utile, non ho idea di quale sia la differenza tra le ultime due righe.
Gakera,

l'output sarebbe -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams

5

Usa 'GetParent ()' come mostrato, funziona bene. Aggiungi il controllo degli errori di cui hai bisogno.

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

L'ho usato 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));
        }
    }
}
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.