Trabalhar com o sistema de arquivos

Concluído

O .NET contém tipos internos que funcionam com um sistema de arquivos que pode ser encontrado no namespace System.IO.

Aqui, você aprenderá sobre os tipos disponíveis em System.IO utilizando o C# para a leitura de um sistema de arquivos para descobrir arquivos e diretórios.

O cenário

Grandes varejistas geralmente gravam dados em arquivos para que possam ser processados posteriormente em lotes.

Cada loja da Tailwind Traders grava os totais de vendas em um arquivo e envia esse arquivo para uma localização central. Para usar esses arquivos, a empresa precisa criar um processo em lotes que possa funcionar com o sistema de arquivos.

Incluir o namespace System.IO

O namespace System.IO contém tipos internos que permitem interagir com arquivos e diretórios. Por exemplo, você pode recuperar coleções de arquivos e diretórios com base nos critérios de pesquisa e nas propriedades get e set para arquivos e diretórios. Também é possível usar os tipos de namespace System.IO para ler e gravar fluxos de dados e arquivos de modo síncrono e assíncrono.

No momento, vamos nos concentrar apenas no que você precisa saber para trabalhar com diretórios usando a classe Directory, contida no namespace System.IO. A classe Directory expõe métodos estáticos para criação, movimentação e enumeração por meio de diretórios e subdiretórios.

Listar todos os diretórios

A classe Directory é frequentemente utilizada para listar (ou enumerar) diretórios. Por exemplo, a estrutura de arquivos da Tailwind Traders tem uma pasta raiz chamada stores. Nessa pasta, há subpastas organizadas por número de loja e dentro dessas pastas estão o total de vendas e os arquivos de inventário. A estrutura é semelhante a este exemplo:

📂 stores
    📄 sales.json
    📄 totals.txt
    📂 201
       📄 sales.json
       📄 salestotals.json
       📄 inventory.txt
    📂 202

Para ler e listar os nomes dos diretórios de nível superior, use a função Directory.EnumerateDirectories.

IEnumerable<string> listOfDirectories = Directory.EnumerateDirectories("stores");

foreach (var dir in listOfDirectories) {
    Console.WriteLine(dir);
}

// Outputs:
// stores/201
// stores/202

Listar arquivos em um diretório específico

Para listar os nomes de todos os arquivos em um diretório, você pode usar a função Directory.EnumerateFiles.

IEnumerable<string> files = Directory.EnumerateFiles("stores");

foreach (var file in files)
{
    Console.WriteLine(file);
}

// Outputs:
// stores/totals.txt
// stores/sales.json

Listar todo o conteúdo de um diretório e todos os subdiretórios

Ambas as funções Directory.EnumerateDirectories e Directory.EnumerateFiles têm uma sobrecarga que aceita um parâmetro para especificar um padrão de pesquisa a que os arquivos e diretórios devem corresponder.

Elas também têm outra sobrecarga que aceita um parâmetro para indicar se é preciso percorrer recursivamente uma pasta especificada e todas as suas subpastas.

// Find all *.txt files in the stores folder and its subfolders
IEnumerable<string> allFilesInAllFolders = Directory.EnumerateFiles("stores", "*.txt", SearchOption.AllDirectories);

foreach (var file in allFilesInAllFolders)
{
    Console.WriteLine(file);
}

// Outputs:
// stores/totals.txt
// stores/201/inventory.txt

No próximo exercício, você deve usar a classe Directory para ler dinamicamente o diretório principal stores da Tailwind Traders e encontrar todos os arquivos sales.json.

Verificar seu conhecimento

1.

Quais das tarefas a seguir você pode realizar com Directory.EnumerateFiles?