Obtenga la ruta completa sin nombre de archivo de la ruta que incluye el nombre de archivo

198

¿Hay algo integrado en System.IO.Path que me dé solo la ruta del archivo?

Por ejemplo, si tengo un string

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

¿Hay algún método BCL que me dará

"c: \ servidor web \ public \ myCompany \ configs \"?

CantSleepAgain
fuente
FWIW: Me he "dado por vencido" en el manejo de la ruta de las "rutas" y utilizamos nuestros propios métodos con mejores expectativas y uniformidad con UNC (intente usar GetDirectoryName en una ruta UNC) y convenciones (por ejemplo, trailing /).
usuario2864740
A menos que el archivo o directorio exista, no hay forma de saber si promo.xmldesigna un archivo o un directorio con ese mismo nombre. Probablemente por eso Path.GetDirectoryName()se implementa de manera tan simple y simplemente trunca el último segmento, o elimina la barra inclinada final si hay una.
Abel

Respuestas:

241

Path.GetDirectoryName()... pero necesita saber que la ruta que está pasando contiene un nombre de archivo; simplemente elimina el bit final de la ruta, ya sea un nombre de archivo o un nombre de directorio (en realidad no tiene idea de cuál).

Primero puede validar probando File.Exists()y / o Directory.Exists()en su ruta primero para ver si necesita llamarPath.GetDirectoryName

Andrew Barber
fuente
2
No hay necesidad de llamar File.Exists(). De hecho, es bastante contraproducente en el caso en que su razón para encontrar el nombre del directorio es crearlo si aún no existe.
Jon Hanna
3
Su ejemplo señala explícitamente una ruta con un nombre de archivo. Si ese es el patrón de las rutas que está probando, y si esas rutas representan archivos existentes, marcar File.Exists () seguramente sería útil, ¿no estaría de acuerdo? Debido a que la situación podría ser de otra manera, por supuesto, solo estaba sugiriendo que 'podría' usar los métodos Existe en Archivo y / o Directorio; obviamente, según sea apropiado para su situación.
Andrew Barber
Sí, una ruta con un nombre de archivo. No hay nada en eso que indique que existe un archivo, ya que los nombres de los archivos son lo primero.
Jon Hanna
44
Como ya he dicho; es una opción y puede ayudar dependiendo de lo que se sepa sobre el camino. O puede que no sea necesario en absoluto. Pero probar File.Exists () y Directory.Exists () en la misma ruta es una forma rápida y fácil de saber si una ruta, que existe, es un archivo o directorio.
Andrew Barber
55
como referencia rápida, en redundancia con la pregunta y trato "obvio", debe incluir System.IOpara que esto funcione.
cregox
70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 
explorador
fuente
2
Esto es lo mejor. Recuerde using System.IO;utilizar métodos de ruta
error de sintaxis el
Tenga en cuenta que esto no incluye una barra diagonal (es trivial agregar uno)
Mingwei Samuel
51

Path.GetDirectoryName()devuelve el nombre del directorio, por lo que podría llamar (con el carácter de solidus inverso al final) Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar.

Jon Hanna
fuente
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

Kobie Williams
fuente
66
Proporcione alguna información sobre cómo el código anterior responde a la pregunta para mejorar esta respuesta.
Eric Hauenstein
1
Path.GetFullPath devuelve la ruta completa sin el nombre del archivo.
Kobie Williams
mostrar la salida sería útil, no tengo idea de cuál es la diferencia entre las dos últimas líneas.
gakera
la salida sería -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams
5

Use 'GetParent ()' como se muestra, funciona bien. Agregue la comprobación de errores según lo necesite.

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

Usé esto y funciona bien:

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));
        }
    }
}
Karam
fuente