O namespace System.IO contém todas as classes necessárias para a manipulação de arquivos e diretórios. Algumas classes fornecem suporte assíncrono, o que permite ler dados de um arquivo sem a necessidade de “congelar” a tela que o usuário está utilizando.
Drives no .NET
A partir do .NET Framework 2.0 temos uma classe chamada DriveInfo. Essa classe basicamente acessa informações de um determinado drive. Essa classe possui vários métodos e propriedades para manipular um determinado drive do computador. Além desses membros de instância, temos um método estático chamado GetDrives que retorna um array de objetos do tipo DriveInfo, onde cada um representa um drive do computador onde a aplicação está sendo executada.
Propriedades da classe DriveInfo:
- AvaliableFreeSpace: indica a quantidade de espaço disponível no disco;
- DriveFormat: especifica o sistema de arquivo, como NTFS ou FAT32;
- DriveType: indica o tipo de drive, pode ser: CDRom, Fixed, Unknow, Network, NoRootDirectory, Ram, Removable;
- IsReady: retorna um valor booleano indicando se o drive está pronto para ser acessado/lido;
- Name: nome do drive;
- RootDirectory: retorna o diretório raiz do drive;
- TotalFreeSpace: indica o total de espaço disponível no drive;
- TotalSize: retorna o total de espaço que o drive possui;
- VolumeLabel: recupera o rótulo do volume do drive.
Listagem 1: Exemplo de utilização da classe DriveInfo
using System.IO;
foreach (DriveInfo d in DriveInfo.GetDrives())
{
if (d.IsReady)
{
Console.WriteLine(d.DriveType.ToString());
Console.WriteLine(d.Name);
}
}Diretórios
Assim como a classe DriveInfo, também temos uma classe estática chamada Directory, que permite manipularmos os diretórios que existem na máquina em que a aplicação está sendo executada ou de algum outro local, dependendo da autorização. Esta classe pussui métodos estáticos para mover, criar, renomear e excluir diretórios. Além disso, permite recuperar todos os seus subdiretórios e arquivos para manipulá-los ou exibí-los.
Ainda há a classe DirectoryInfo que também permite executar as mesmas operações que a classe Directory fornece, mas agora para um diretório específico. Se você precisar invocar várias propriedades e/ou métodos relacionados a um diretório, considere o uso desta classe em relação a classe Directory, porque a checagem de segurança não será sempre necessária.
Principais propriedades da classe DirectoryInfo:
- CreationTime: retorna a data de criação do diretório;
- FullName: retorna o caminho completo do diretório, desde a sua raiz;
- Name: retorna o nome do diretório;
- Parent: retorna o diretório que é “pai” do diretório corrente;
- Root: retorna o nível mais alto onde, na maioria dos casos, é o drive.
Listagem 2: Exemplos de como criar, ler o conteúdo e apagar um determinado diretório
using System.IO;
string path = @"c:\Temp\Arquivos";
DirectoryInfo dir = null;
if (!Directory.Exists(path))
dir = Directory.CreateDirectory(path); //criação do diretório
if (dir != null)
{
//Sub-diretórios
foreach(DirectoryInfo subDir in dir.GetDirectories()) //pega informacoes do diretorio criado
Console.WriteLine(subDir.Name);
//Arquivos
foreach (FileInfo fileName in dir.GetFiles()) //loop em todos os arquivos do diretorio
Console.WriteLine(fileName.Name);
dir.Delete(true);
}O método GetFiles() ainda possui um overload que permite informar qual tipo de arquivos que desejamos recuperar, como: se desejarmos apenas recuperar os arquivos texto, então poderíamos fazer: dir.GetFiles(“*.txt”). Finalmente chamamos o método Delete para excluir o diretório. O parâmetro True que passamos para ele, indica que será uma exclusão recursiva, ou seja, tudo que estiver dentro dele, também será excluído.
Observação: quando invocamos os métodos estáticos GetDirectories e GetFiles da classe Directory, é retornado um array de string contendo os nomes dos diretórios e arquivos, respectivamente.
Arquivos
Temos duas classes para manipulação de arquivos: File e FileInfo.
A classe File possui métodos estáticos para as operações mais comuns com arquivos, como criação, cópia, exclusão e a movimentação de arquivos.
Já a classe FileInfo traz informações completas de um determinado arquivo, além de fornecer as operações típicas e, como já era de se esperar, operando apenas com o arquivo que ela representa. Assim como a classe DirectoryInfo, utilize-a somente se precisar efetuar várias operações em cima deste arquivo. Do contrário, opte pela uso da classe File que, para uma única operação, é mais performática.
Principais propriedades da classe FileInfo:
- CreationTime: retorna a data de criação do arquivo;
- Directory: retorna uma instância da classe DirectoryInfo que representa o diretório em que o arquivo está contido;
- DirectoryName: retorna o caminho completo até o diretório onde o arquifo está contido;
- Extension: retorna a extensão do arquivo. Se o arquivo chamar “Arquivo.txt” essa propriedade retornará “.txt”;
- FullName: resgata o caminho completo do arquivo;
- IsReadOnly: retorna um valor booleano indicando se o arquivo é ou não de somente leitura;
- Length: retorna o tamanho do arquivo;
- Name: recupera o nome do arquivo.
Listagem 3: Exemplode uso das classes File e FileInfo
using System.IO;
string fileName = "Arquivo.txt";
if (!File.Exists(fileName))
{
File.Create(fileName);
FileInfo info = new FileInfo(fileName);
Console.WriteLine(info.CreationTime);
File.Delete(fileName);
}Manipulando caminhos (paths)
A classe Path encapsula todo o trabalho para manipular caminhos de arquivos e diretórios. Além disso, as operações são executadas para suportar multi-plataforma, ou seja, como isso pode variar de sistema operacional para sistema operacional, a classe Path se encarrega de retornar o valor correto baseando-se na plataforma que a aplicação está sendo executada.
Alguns métodos:
- ChangeExtension: dado um arquivo com sua extensão e uma nova extensão, esse método retorna uma nova string contendo o mesmo arquivo (com seu caminho), mas agora com a nova extensão informada;
- Combine: permite combinar dois caminhos, fazendo todo o trabalho para manipulação dos separadores;
- GetDirectoryName: dado um caminho, ele retorna uma string contendo apenas o caminho até o último diretório;
- GetExtension: dado um nome de arquivo junto com a sua extensão, ele retorna apenas a extensão do arquivo. Exemplo: “Arquivo.txt” retorna “.txt”;
- GetFileName: dado um caminho completo até um determinado arquivo, retorna apenas o nome do arquivo junto com a sua extensão;
- GetFileNameWithoutExtension: dado um caminho completo até um determinado arquivo, retorna apenas o nome do arquivo, sem a extensão;
- GetRandomFileName: retorna um nome de arquivo aleatório, podendo inclusive ser utilizado como nome para diretórios. Este método não cria o arquivo/pasta fisicamente;
- GetTempFileName: cria fisicamente um arquivo vazio com um nome único e de extensão .TMP, que é retornado pelo método;
- GetTempPath: retorna o caminho até o diretório de sistema que é a pasta temporária. Geralmente o caminho é: C:\Documents and Settings\\Local Settings\Temp\;
- HasExtension: retorna um valor booleano indicando se o caminho possui ou não uma extensão de arquivo.