Programa en WPF C #. Tengo, por ejemplo, el siguiente camino:
C:\Program Files\hello.txt
y quiero extraer hello
de eso
La ruta se string
recupera de una base de datos. Actualmente estoy usando el siguiente código para dividir la ruta '\'
y luego dividir nuevamente por '.'
:
string path = "C:\\Program Files\\hello.txt";
string[] pathArr = path.Split('\\');
string[] fileArr = pathArr.Last().Split('.');
string fileName = fileArr.Last().ToString();
Funciona, pero creo que debería haber una solución más corta e inteligente para eso. ¿Alguna idea?
Path.GetFileName("C:\\dev\\some\\path\\to\\file.cs")
devuelve la misma cadena y no la convierte a "file.cs" por alguna razón. Si copio / pego mi código en un compilador en línea (como rextester.com ), ¿funciona ...?Respuestas:
Path.GetFileName
Path.GetFileNameWithoutExtension
La clase de Path es maravillosa.
fuente
tratar
http://msdn.microsoft.com/de-de/library/system.io.path.getfilename.aspx
fuente
tratar
manifestación
https://msdn.microsoft.com/en-gb/library/system.io.path.getfilenamewithoutextension%28v=vs.80%29.aspx
fuente
Puede usar Path API de la siguiente manera:
Más información: Path.GetFileNameWithoutExtension
fuente
Path.GetFileNameWithoutExtension
fuente
Prueba esto:
Esto devolverá "hola" para fileName.
fuente
fuente
Prueba esto,
fuente
fuente
FileVersionInfo
se pueda usar en archivos que no tienen información de versión. Tenga en cuenta queGetVersionInfo()
solo se puede usar en rutas que hacen referencia a un archivo que ya existe. Si bien cualquiera de las clases puede usarse para obtener el nombre del archivo, la pregunta también solicitó eliminar la extensión.En primer lugar, el código en la pregunta no produce el resultado descrito. Extrae la extensión del archivo (
"txt"
) y no el nombre base del archivo ("hello"
). Para hacer eso, la última línea debería llamarFirst()
, noLast()
, así ...Habiendo hecho ese cambio, una cosa en la que pensar en cuanto a mejorar este código es la cantidad de basura que crea:
string[]
contiene unostring
para cada segmento de ruta enpath
string[]
contiene al menos unostring
para cada uno.
en el último segmento de ruta enpath
Por lo tanto, extraer el nombre del archivo de base de la trayectoria de la muestra
"C:\Program Files\hello.txt"
debe producir el (temporal)object
s"C:"
,"Program Files"
,"hello.txt"
,"hello"
,"txt"
, unastring[3]
, y unastring[2]
. Esto podría ser significativo si el método se llama en una gran cantidad de rutas. Para mejorar esto, podemos buscarpath
nosotros mismos para localizar los puntos de inicio y finalización del nombre base y usarlos para crear uno nuevostring
...Esto está usando el índice del carácter después del último
\
como el comienzo del nombre base, y desde allí buscando el primero.
para usar como índice del carácter después del final del nombre base. ¿Es esto más corto que el código original? No exactamente. ¿Es una solución "más inteligente"? Creo que sí. Al menos, lo sería si no fuera por el hecho de que ...Como puede ver en el comentario, el método anterior es problemático. Aunque funciona si asume que todas las rutas terminan con un nombre de archivo con una extensión, arrojará una excepción si la ruta termina con
\
(es decir, una ruta de directorio) o si no contiene ninguna extensión en el último segmento. Para solucionar esto, necesitamos agregar un cheque adicional para tener en cuenta cuándoendIndex
es-1
(.
es decir, no se encuentra) ...Ahora esta versión no es mucho más corta que la original, pero es más eficiente y (ahora) correcta también.
En cuanto a los métodos .NET que implementan esta funcionalidad, muchas otras respuestas sugieren el uso
Path.GetFileNameWithoutExtension()
, que es una solución obvia y fácil pero que no produce los mismos resultados que el código de la pregunta. Hay una diferencia sutil pero importante entreGetFileBaseNameUsingSplit()
yPath.GetFileNameWithoutExtension()
(aGetFileBaseNameUsingPath()
continuación): el primero extrae todo antes del primero.
y el segundo extrae todo antes del último.
. Esto no hace una diferencia para la muestrapath
en la pregunta, pero eche un vistazo a esta tabla que compara los resultados de los cuatro métodos anteriores cuando se llama con varias rutas ...... y verá que
Path.GetFileNameWithoutExtension()
arroja resultados diferentes cuando se pasa una ruta donde el nombre del archivo tiene una extensión doble o un inicio y / o final.
. Puede probarlo usted mismo con el siguiente código ...TL; DR El código en la pregunta no se comporta como muchos parecen esperar en algunos casos de esquina. Si va a escribir su propio código de manipulación de ruta, asegúrese de tener en cuenta ...
.
o todo antes del último.
?).
.
(probablemente no sea algo que jamás encuentre en Windows, pero son posibles ).
\
¡No todas las rutas de archivo siguen la fórmula habitual de
X:\Directory\File.ext
!fuente
fuente