Acessar arquivos e pastas com o .NET e o SDK do Aplicativo Windows
Os aplicativos empacotados do SDK do Aplicativo Windows podem utilizar as APIs do .NET para ler e gravar arquivos, trabalhar com pastas e ler informações de unidade e volume. Além disso, qualquer aplicativo de área de trabalho empacotado pode utilizar as APIs do WinRT e do Win32 no SDK do Windows, bem como as APIs fornecidas no SDK do .NET. Este artigo fornece diretrizes sobre como usar as APIs System.IO do .NET para ler e gravar arquivos, gerenciar unidades e pastas e trabalhar com fluxos de memória para codificar ou decodificar dados de cadeia de caracteres.
Ler e gravar arquivos com APIs do .NET
No exemplo a seguir, ReadWriteFiles
cria um arquivo, grava um conjunto de inteiros nele e os lê no arquivo. O exemplo usa a classe FileStream para criar um arquivo e abri-lo para leitura ou gravação. O exemplo usa a classe BinaryWriter para gravar os inteiros no arquivo e a classe BinaryReader para ler esses inteiros.
using System.IO;
...
ReadWriteFiles("test.bin");
...
private void ReadWriteFiles(string fileName)
{
if (File.Exists(fileName))
{
Console.WriteLine($"{fileName} already exists!");
return;
}
using (FileStream fs = new(fileName, FileMode.CreateNew))
{
using BinaryWriter writer = new(fs);
for (int i = 0; i < 11; i++)
{
writer.Write(i);
}
}
using (FileStream fs = new(fileName, FileMode.Open, FileAccess.Read))
{
using BinaryReader reader = new(fs);
for (int i = 0; i < 11; i++)
{
Console.WriteLine(reader.ReadInt32());
}
}
}
Gerenciar unidades e pastas no .NET
O exemplo a seguir mostra como usar as classes DirectoryInfo e Directory para criar, excluir e gerenciar pastas. O exemplo usa a classe DirectoryInfo
para criar um diretório, criar um subdiretório e excluir o diretório. A classe DirectoryInfo
fornece métodos estáticos para criar, mover e enumerar diretórios e subdiretórios. A classe Directory
fornece métodos estáticos para criar, mover e enumerar diretórios e subdiretórios.
using System.IO;
...
private void FolderTest()
{
FolderManagement(@"c:\MyDir", "Projects");
}
private void FolderManagement(string path, string subfolderName)
{
DirectoryInfo di = new(path);
try
{
// Create directory if it doesn't exist
if (di.Exists)
{
Console.WriteLine("Path already exists.");
}
else
{
di.Create();
Console.WriteLine("The directory was created successfully.");
}
// Create subdirectory if it doesn't exist
string subfolderPath = Path.Combine(path, subfolderName);
if (Directory.Exists(subfolderPath))
{
Console.WriteLine("Subfolder path already exists.");
}
else
{
di.CreateSubdirectory(subfolderName);
Console.WriteLine("The subdirectory was created successfully.");
}
// Delete directory
di.Delete(true);
Console.WriteLine("The directory was deleted successfully.");
}
catch (Exception ex)
{
Console.WriteLine("The process failed: {0}", ex.ToString());
}
}
Este exemplo usa o método estático GetDrives para recuperar informações sobre todas as unidades no sistema. A classe DriveInfo fornece informações sobre uma unidade, como o tipo de unidade, o rótulo, o sistema de arquivos e o espaço livre disponível.
using System.IO;
...
private void DriveManagement()
{
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo d in drives)
{
Console.WriteLine($"Drive name: {d.Name}");
Console.WriteLine($" Drive type: {d.DriveType}");
if (d.IsReady)
{
Console.WriteLine($" Volume label: {d.VolumeLabel}");
Console.WriteLine($" File system type: {d.DriveFormat}");
Console.WriteLine($" Space available to user: {d.AvailableFreeSpace, 15} bytes");
Console.WriteLine($" Total available space: {d.TotalFreeSpace, 15} bytes");
Console.WriteLine($" Total size of drive: {d.TotalSize, 15} bytes ");
}
}
}
Codificar e decodificar cadeias de caracteres com MemoryStream
Este exemplo mostra como usar a classe MemoryStream para codificar e decodificar dados de cadeia de caracteres. Primeiro, ele cria um MemoryStream
para gravar de maneira assíncrona uma cadeia de caracteres em um fluxo de memória e, em seguida, lê essa cadeia de caracteres no fluxo de memória. A classe Encoding é usada para converter a cadeia de caracteres em uma matriz de bytes e, em seguida, gravar a matriz de bytes no fluxo de memória. Em seguida, um StreamReader é usado para ler de maneira assíncrona a matriz de bytes no fluxo de memória e convertê-la novamente em uma cadeia de caracteres chamando ReadToEndAsync.
using System.IO;
using System.Text;
...
private async Task EncodeDecodeStringAsync(string inputData)
{
using MemoryStream stream = new();
var inputBytes = Encoding.UTF8.GetBytes(inputData);
await stream.WriteAsync(inputBytes, 0, inputBytes.Length);
stream.Seek(0, SeekOrigin.Begin);
using StreamReader reader = new(stream);
string text = await reader.ReadToEndAsync();
Console.WriteLine(text);
}
Observação
Para saber mais sobre a conversão entre fluxos do .NET e fluxos do WinRT, confira Como converter entre fluxos do .NET e do Windows Runtime.
Confira também
Acessar arquivos e pastas com APIs do WinRT e o SDK do Aplicativo Windows
Arquivos, pastas e bibliotecas com o SDK do Aplicativo Windows
Windows developer