Ejercicio: Trabajar con el sistema de archivos

Completado

.NET se puede usar para encontrar y devolver información relativa a archivos y carpetas.

Tailwind Traders tiene muchas tiendas físicas repartidas por todo el mundo. Por la noche, cada tienda crea un archivo denominado sales.json que contiene el total de todas las ventas de ese día. Estos archivos están organizados en carpetas denominadas con el id. de la tienda.

Nota:

En este módulo se usan la CLI (interfaz de la línea de comandos) de .NET y Visual Studio Code para el desarrollo local. Al terminar este módulo, puede aplicar los conceptos que ha aprendido mediante un entorno de desarrollo como Visual Studio (Windows), Visual Studio para Mac (macOS), o bien el desarrollo continuo con Visual Studio Code (Windows, Linux y macOS).

En este módulo se usa el SDK de .NET 8.0. Asegúrese de que tiene instalado .NET 8.0 mediante la ejecución del siguiente comando en el terminal de comandos que prefiera:

dotnet --list-sdks

Aparecerá un resultado similar al del ejemplo siguiente:

6.0.317 [C:\Program Files\dotnet\sdk]
7.0.401 [C:\Program Files\dotnet\sdk]
8.0.100 [C:\Program Files\dotnet\sdk]

Asegúrese de que aparezca una versión que comience en 8. Si no aparece ninguna o no se encuentra el comando, instale el SDK más reciente de .NET 8.0.

Clonación del proyecto

En este ejercicio, escribe un programa de .NET que busca archivos denominados sales.json en un directorio y sus subdirectorios.

Ya se ha creado automáticamente un proyecto de inicio. Los clonas mediante el terminal integrado en Visual Studio Code.

  1. Abra Visual Studio Code.

  2. En el menú principal, seleccione Ver>Terminal para abrir una ventana de terminal.

  3. (Opcional) En la ventana del terminal, cambie a un directorio al que desea copiar los archivos, como c:\MyProjects.

  4. En la ventana del terminal, ejecute el siguiente comando para clonar el proyecto de inicio y vaya al proyecto clonado:

    git clone https://github.com/MicrosoftDocs/mslearn-dotnet-files && cd mslearn-dotnet-files
    
  5. Ejecute el comando siguiente para crear un proyecto de consola de .NET:

    dotnet new console -f net8.0 -n mslearn-dotnet-files -o .
    
  6. Ejecute el comando siguiente para abrir el nuevo proyecto de .NET en la misma instancia de Visual Studio Code:

    code -a .
    

    Sugerencia

    En este momento, Visual Studio Code puede solicitarle que falten los recursos necesarios para compilar y ejecutar el proyecto.

    Captura de pantalla en la que se muestra el mensaje de Visual Studio que indica al usuario que falta algo en el proyecto.

    Seleccione el triángulo con el signo de exclamación y después Relaunch terminal (Reiniciar terminal) para agregar los archivos que permiten a Visual Studio Code ejecutar y depurar el proyecto.

  7. En la ventana Explorador, en mslearn-dotnet-files, expanda el almacena carpeta y cada una de las carpetas numeradas dentro.

    Recorte de pantalla de la ventana Explorador que muestra la estructura de carpetas del proyecto.

Búsqueda de los archivos sales.json

Las tareas siguientes crean un programa para buscar todos los archivos sales.json en todas las carpetas del proyecto mslearn-dotnet-files.

Inclusión del espacio de nombres System.IO

  1. En la ventana Explorador, seleccione el archivo Program.cs para abrirlo en el editor.

    Captura de pantalla de la ventana Explorador en la que se resalta el archivo program.cs.

  2. Pegue el código siguiente en la primera línea del archivo Program.cs para importar los espacios de nombres System.IO y System.Collections.Generic:

    using System.IO;
    using System.Collections.Generic;
    

Nota:

A partir de .NET 6, las dos instrucciones del código anterior se incluyen automáticamente en un nuevo proyecto mediante el grupo de propiedades ImplcitUsings. Como se ha especificado la marca -f net8.0 al crear un proyecto de consola, se agregan implícitamente. Pero si trabaja con un proyecto anterior, se deben incluir en el archivo Program.cs y no afecta a este proyecto si las deja en el archivo.

Escritura de una función para buscar los archivos sales.json

Cree una función denominada FindFiles que tome un parámetro folderName.

  1. Reemplace la línea Console.WriteLine("Hello, World!"); por el código siguiente:

    IEnumerable<string> FindFiles(string folderName)
    {
        List<string> salesFiles = new List<string>();
    
        var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
    
        foreach (var file in foundFiles)
        {
            // The file name will contain the full path, so only check the end of it
            if (file.EndsWith("sales.json"))
            {
                salesFiles.Add(file);
            }
        }
    
        return salesFiles;
    }
    
  2. Inserte el código siguiente debajo de las instrucciones using para llamar a la función FindFiles. Este código pasa el nombre de la carpeta stores como la ubicación en la que buscar los archivos.

    var salesFiles = FindFiles("stores");
    
    foreach (var file in salesFiles)
    {
        Console.WriteLine(file);
    }
    
  3. Presione Ctrl+S (o Cmd+S en macOS) para guardar el archivo Program.cs.

Ejecución del programa

  1. Escriba el comando siguiente en la ventana de terminal para ejecutar el programa:

    dotnet run
    
  2. El programa debe mostrar la salida siguiente:

    stores/sales.json
    stores/201/sales.json
    stores/202/sales.json
    stores/203/sales.json
    stores/204/sales.json
    

Excelente. Ha escrito correctamente un programa de línea de comandos que recorre todas las carpetas del directorio stores y enumera todos los archivos sales.json que encuentre.

En este ejemplo, la ruta al directorio stores era bastante sencilla y se encontraba dentro del directorio de trabajo del programa. En la unidad siguiente, aprenderá a crear rutas complejas que funcionan en varios sistemas operativos mediante la clase Path.

¿Se ha bloqueado?

Si ha tenido problemas para ejecutar el programa, este es el código completo del archivo Program.cs. Reemplace el contenido del archivo Program.cs por este código:

var salesFiles = FindFiles("stores");
    
foreach (var file in salesFiles)
{
    Console.WriteLine(file);
}

IEnumerable<string> FindFiles(string folderName)
{
    List<string> salesFiles = new List<string>();

    var foundFiles = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);

    foreach (var file in foundFiles)
    {
        // The file name will contain the full path, so only check the end of it
        if (file.EndsWith("sales.json"))
        {
            salesFiles.Add(file);
        }
    }

    return salesFiles;
}