2011-05-16 23 views
15

Necesito extraer la información de ruta usando Path.GetFileName(), y esta función no funciona cuando el último carácter de la cadena de entrada es DirectorySeparatorChar ('/' o '\').Eliminar el último carácter si es DirectorySeparatorChar con C#

Se me ocurrió este código, pero es demasiado largo. ¿Hay una mejor manera de hacerlo?

string lastCharString = fullPath.Substring (fullPath.Length-1); 
char lastChar = lastCharString[0]; 

if (lastChar == Path.DirectorySeparatorChar) { 
    fullPath = fullPath.Substring(0, fullPath.Length-1); 
} 

Respuesta

40
fullPath = fullPath.TrimEnd(Path.DirectorySeparatorChar); 
+3

Esto no funcionará con el separador de ruta de directorio alternativo. Debería hacer un fullPath.TrimEnd (Path.AltDirectorySeparatorChar) después de esto para no tener un error en rutas como: "c:/ruta /" –

+7

De acuerdo, gracias. Probablemente 'TrimEnd (Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)' en ese caso (para evitar iterar sobre la cadena dos veces). –

0
fullPath = Path.GetFileName(
    fullPath.Split(
     new [] { Path.DirectorySeparatorChar }, 
     StringSplitOptions.RemoveEmptyEntries 
    ).Last() 
) 
+1

¿Qué me falta: en cuyo caso es el 'Path.GetFileName()' sigue siendo relevante, si sólo se mantiene el último elemento de la trayectoria de todos modos? –

2
string path1 = @"c:\directory\"; 
string path2 = @"c:\directory\file.txt"; 
string path3 = @"c:\directory"; 

Console.WriteLine(Path.Combine(Path.GetDirectoryName(path1), Path.GetFileName(path1))); 
Console.WriteLine(Path.Combine(Path.GetDirectoryName(path2), Path.GetFileName(path2))); 
Console.WriteLine(Path.Combine(Path.GetDirectoryName(path3), Path.GetFileName(path3))); 

Da:

c:\directory 
c:\directory\file.txt 
c:\directory 

espero que ayude.

+0

C: \ directorio devolverá C: \ –

+0

@Ritch copie y pegue el código e inténtelo. Le dará c: \ directorio. Actualizaré el sampel para incluir eso. –

+0

@Marino Ok, no lo probé, solo revisé los documentos. –

2
while(fullPath.EndsWith(Path.DirectorySeparatorChar.ToString())){ 
    fullPath = fullPath.Substring(0, fullPath.Length-1); 
} 
+1

El parámetro para EndsWith() debe ser una cadena, pero se da una entrada de tipo de carácter. Entonces, recibí un error (con Mono). – prosseek

+0

@prosseek Sí, olvidé agregar el ToString() – markt

7
// If the fullPath is not a root directory 
if (Path.GetDirectoryName(fullPath) != null) 
    fullPath = fullPath.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); 
+1

Esta debería ser la respuesta principal. – Celess

+0

No, no debería ser la respuesta principal, solo regurgita la respuesta de Ben Podszun, incluidos los detalles en los comentarios de esa respuesta. – Zoomzoom

+0

Bueno, en realidad debería, ya que deja @ "C: \" como es lo que realmente me gusta. – Pieter21

Cuestiones relacionadas