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.