Trabalhar com o sistema de ficheiros

Concluído

O .NET contém tipos internos para trabalhar com o sistema de arquivos que você pode encontrar no System.IO namespace.

Aqui, você aprende sobre os tipos disponíveis usando System.IO C# para ler um sistema de arquivos para descobrir arquivos e diretórios.

Cenário

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

A Tailwind Traders pede a cada uma das respetivas lojas que escrevam os seus totais de vendas e que enviem esse ficheiro para uma localização central. Para utilizar esses ficheiros, a empresa precisa de criar um processamento em lotes que possa funcionar com o sistema de ficheiros.

Incluir o espaço de nomes 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 em critérios de pesquisa e getset propriedades de arquivos e diretórios. Você também pode usar System.IO tipos de namespace para ler e gravar fluxos de dados e arquivos de forma síncrona e assíncrona.

Por enquanto, vamos concentrar-nos no que precisa de saber para trabalhar com diretórios ao utilizar a classe Directory contida no espaço de nomes System.IO. A classe Directory expõe métodos estáticos para criar, mover e enumerar através de diretórios e subdiretórios.

Listar todos os diretórios

A Directory classe é frequentemente usada para listar (ou enumerar) diretórios. Por exemplo, a estrutura de arquivos do Tailwind Traders tem uma pasta raiz chamada stores. Nessa pasta estão subpastas organizadas por número de loja, e dentro dessas pastas estão os arquivos de total de vendas e inventário. A estrutura se parece com 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 Directory.EnumerateDirectories função.

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

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

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

Listar ficheiros num diretório específico

Para listar os nomes de todos os ficheiros num diretório, pode utilizar 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 todos os conteúdos num diretório e todos os subdiretórios

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

Também têm outra sobrecarga que aceita um parâmetro para indicar se deve percorrer de forma recursiva uma pasta especificada ou todas as 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ê usa a Directory classe para ler dinamicamente o diretório de lojas principais do Tailwind Traders para encontrar todos os arquivos sales.json.