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 \"?



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


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")); 

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.


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


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;

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));
        }
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.