viernes, 17 de julio de 2015

Receta C# No. 5-12: Manipulación de Cadenas de Nombres de Archivos

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta duodécima receta C# estudiáremos la clase System.IO.Path; clase que nos será de utilidad para la manipulación de las cadenas de caracteres que representan el nombre de un directorio o un archivo. Ya veremos que entre las características sobresalientes de esta clase está la de manipulación en abstracto de la representación de rutas existentes en los diferentes sistemas operacionales o de rutas completamente calificadas y relativas.

1. Problema

Deseamos obtener y manipular las cadenas de caracteres que representan los nombres de archivos.

2. Solución

Con la clase Path del nombre de espacio System.IO podemos procesar la cadena de caracteres del nombre un archivo. Existen varios métodos static para lograr este cometido; entre ellos:
  • Path.Combine
  • Path.GetFileName
  • Path.GetFullPath.

3. Discusión de la Solución

Con el uso de los miembros static de la clase Path [2] el programador no debe tener en consideración el carácter de separación de directorio (e.g., /, \, ., >) [3] para las operaciones de composición de rutas: esta tarea se realiza de forma transparente. Con esta característica que ofrece la clase Path el programador puede trabajar en abstracto (refiriéndonos al manejo transparente por parte de los métodos de la clase) con representaciones de rutas como estas:
  • Rutas absolutas: C:\etc
  • Ruta UNC [4]: \\Servidor\\DocumentosCompartidos\\
  • Rutas relativas: C:\etc\dev\...\ o C:\etc\dev\CSharp\..\..\recetas
Asumamos que en el directorio C:\etc\dev\ tenemos el archivo RecetasSerie5.txt y queremos obtener únicamente el nombre del archivo a partir de la ruta absoluta -C:\etc\dev\RecetasSerie5.txt-:

string nombreArchivo = @"C:\etc\dev\RecetasSerie5.txt";
nombreArchivo = Path.GetFileName(nombreArchivo);

Con invocar Path.GetFileName [5] con la ruta absoluta del archivo pasada como argumento obtendremos el nombre del archivo, luego esté valor será asignado a la variable nombreArchivo:

Console.WriteLine(nombreArchivo); // RecetasSerie5.txt

Veamos ahora otra de las utilidades de los métodos disponibles en esta clase -Path.Combine [6]-:

El método Combine posee varias versiones sobrecargadas:
Versiones sobrecargadas de Combine
Tabla 1. Versiones sobrecargadas de Combine [6].
Lo que podemos hacer con este método es construir una ruta a partir de la combinación de cadenas de caracteres. veamos este fragmento de código C# para entender su funcionamiento y utilidad:

string nombreArchivo = @"..\..\RecetasSerie5.txt";
string rutaAbsoluta = @"C:\etc";

nombreArchivo = Path.GetFileName(nombreArchivo);
rutaAbsoluta = Path.Combine(rutaAbsoluta, nombreArchivo);

Console.WriteLine(rutaAbsoluta); // C:\etc\RecetasSerie5.txt

En [1] manifiestan la ventaja programática de usar Combine:
"The advantage of this approach is that a trailing backslash (\) is automatically added to the path name if required."
Por otro lado, en la Tabla 2 podemos observar otros métodos static interesantes de esta clase:
Métodos static de Path
Tabla 2. Métodos static de Path [2].

Finalmente, en [1] nos advierten:
"In most cases, an exception will be thrown if you try to supply an invalid path to one of these methods (for example, paths that include illegal characters). [...] You could use the Path.GetInvalidPathChars method to obtain an array of characters that are illegal in path names."

4. Práctica: Código C#

Escribamos un programa C# para usar varios de los métodos disponibles en System.IO.Path:

En las líneas 14-16 creamos tres objetos string para almacenar rutas de directorios y archivos. Con 

if (Path.HasExtension(ruta1))


(línea 19) comprabamos que la variable ruta1 contiene un archivo con extensión. En la línea 25 hacemos la misma validación para la variable ruta2.

Por otra parte, con la llamada a Path.IsPathRooted(string) en la línea 31 comprábamos si ruta3 es una ruta absoluta.


Al final, sobre la línea 38, obtenemos la ruta absoluta ruta3 con la llamada a Path.GetFullPath(string).

Compilación:


  1. csc /target:exe ManipulacionRutas.cs

Ejecución assembly:


  1. .\ManipulacionRutas.exe

> Prueba de ejecución:
Ejecución assembly ManipulacionRutas.exe
Figura 1. Ejecución assembly ManipulacionRutas.exe.

5. Conclusiones

Ya sabemos que la clase System.IO.Path nos brinda métodos static para trabajar con rutas de directorios y archivos. Observamos que uno de los soportes más sobresalientes que ofrece esta clase es la composición de rutas, que en el caso de ser necesario agrega de forma automática los separadores de directorios que sean necesarios.


La próxima receta C# de archivos, directorios, y entrada y salida la dedicaremos a estudiar cómo podemos determinar si una ruta es un directorio o un archivo.

6. Glosario

  • Archivo
  • Directorio
  • Ruta
  • Separador de directorio

7. Literatura & Enlaces

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Path Class (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx
[3]: Representations of paths by operating system and shell - https://en.wikipedia.org/wiki/Path_(computing)#Representations_of_paths_by_operating_system_and_shell
[4]: Uniform Naming Convention - https://en.wikipedia.org/wiki/Path_(computing)#Uniform_Naming_Convention
[5]: Path.GetFileName Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.path.getfilename(v=vs.110).aspx
[6]: Path.Combine Method (System.IO) - https://msdn.microsoft.com/en-us/library/system.io.path.combine(v=vs.110).aspx


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.