Trabajo con rutas de acceso de archivo en .NET

Completado

.NET tiene un mecanismo integrado para trabajar con las rutas de acceso del sistema de archivos.

En el ejercicio anterior, no había demasiadas carpetas para analizar. Si tiene un sistema de archivos con muchos archivos y carpetas, la creación manual de rutas puede ser tediosa. Afortunadamente, .NET proporciona algunas constantes y funciones de utilidad integradas para facilitar el control de las rutas de archivo.

Aquí se aprenden algunas de las constantes y funciones de utilidad del espacio de nombres System.IO y el tipo System.Environment que le ayudarán a hacer que el programa sea más inteligente y resistente.

Distinción del directorio actual

A veces, no sabe en qué directorio o ruta de acceso debe ejecutarse el programa. Imagine que quiere que el programa use el directorio actual, pero no conoce la ruta.

.NET expone la ruta de acceso completa al directorio actual a través del método Directory.GetCurrentDirectory.

Console.WriteLine(Directory.GetCurrentDirectory());

Si ejecuta el código anterior de la carpeta 201 en la estructura siguiente, Directory.GetCurrentDirectory() devuelve stores\201:

📂 stores
    📂 201

Trabajo con directorios especiales

.NET se ejecuta en todas partes: Windows, macOS, Linux e incluso en sistemas operativos para dispositivos móviles como iOS y Android. Cada sistema operativo podría tener o no el concepto de carpetas del sistema especiales (como un directorio—principal dedicado a archivos—específicos del usuario o un directorio de escritorio, o un directorio para almacenar archivos temporales).

Esos tipos de directorios especiales difieren para cada sistema operativo. Sería engorroso recordar la estructura de directorios de cada sistema operativo y realizar cambios en función del sistema operativo actual.

La enumeración System.Environment.SpecialFolder especifica constantes para recuperar rutas de acceso a carpetas especiales del sistema.

El código siguiente devuelve la ruta equivalente de la carpeta Mis documentos de Windows o el directorio HOME del usuario para cualquier sistema operativo, aunque el código se ejecute en Linux:

string docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

Trabajo con rutas de acceso

Las rutas son un tema que surge tan a menudo que .NET incluye una clase denominada Path dedicada de forma concreta a trabajar con ellas.

La clase Path se encuentra en el espacio de nombres System.IO de .NET y no es necesario instalarla.

Caracteres especiales de las rutas de acceso

Cada sistema operativo usa caracteres diferentes para separar los niveles de directorio.

Por ejemplo, Windows usa la barra diagonal inversa (stores\201), y macOS usa la barra diagonal (stores/201).

Para ayudarle a usar el carácter correcto, la clase Path contiene el campo DirectorySeparatorChar.

.NET interpreta automáticamente ese campo en el carácter separador aplicable al sistema operativo cuando necesite crear una ruta de forma manual.

Console.WriteLine($"stores{Path.DirectorySeparatorChar}201");

// returns:
// stores\201 on Windows
//
// stores/201 on macOS

Rutas de combinación

La clase Path funciona con el concepto de rutas de acceso de archivos y carpetas, que son simplemente cadenas. Puede usar la clase Path para crear de forma automática rutas correctas para sistemas operativos específicos.

Por ejemplo, si quiere obtener la ruta de acceso a la carpeta stores/201, puede usar la función Path.Combine para ello.

Console.WriteLine(Path.Combine("stores","201")); // outputs: stores/201

Recuerde que debería usar la clase Path.Combine o Path.DirectorySeparatorChar en lugar de cadenas codificadas de forma rígida porque el programa podría ejecutarse en muchos sistemas operativos diferentes. La clase Path siempre da formato a las rutas de acceso correctamente para el sistema operativo en el que se ejecuta.

Sugerencia

La clase Path no se preocupa de si algo realmente existe o no. Las rutas son conceptuales, no físicas, y la clase crea y analiza cadenas de forma automática.

Determinación de extensiones de nombre de archivo

La clase Path también puede indicarle la extensión de un nombre de archivo. Si tiene un archivo y quiere saber si es JSON, puede usar la función Path.GetExtension.

Console.WriteLine(Path.GetExtension("sales.json")); // outputs: .json

Obtención de todo lo que es necesario saber sobre un archivo o ruta de acceso

La clase Path contiene muchos métodos diferentes que realizan diversas acciones. Si quiere obtener el máximo de información posible sobre un directorio o un archivo, use la clase DirectoryInfo o FileInfo, respectivamente.

string fileName = $"stores{Path.DirectorySeparatorChar}201{Path.DirectorySeparatorChar}sales{Path.DirectorySeparatorChar}sales.json";

FileInfo info = new FileInfo(fileName);

Console.WriteLine($"Full Name: {info.FullName}{Environment.NewLine}Directory: {info.Directory}{Environment.NewLine}Extension: {info.Extension}{Environment.NewLine}Create Date: {info.CreationTime}"); // And many more

Hay muchas más propiedades útiles y métodos de utilidad en las clases Path, DirectoryInfo y FileInfo, pero estos conceptos básicos son los que probablemente utilizará con más frecuencia. En el siguiente ejercicio, creará rutas de acceso e identificará archivos .json.