Accedere a file e cartelle con Windows App SDK e .NET
Le app di Windows App SDK in pacchetto possono sfruttare le API .NET per la lettura e la scrittura di file, l'uso di cartelle e la lettura di informazioni sull'unità e sul volume. Qualsiasi app desktop in pacchetto può inoltre usare le API WinRT e Win32 in Windows SDK, nonché le API fornite in .NET SDK. Questo articolo fornisce indicazioni su come usare le API System.IO .NET per leggere e scrivere file, gestire unità e cartelle e usare flussi di memoria per codificare o decodificare i dati stringa.
Leggere e scrivere file con le API .NET
Nell'esempio seguente ReadWriteFiles
crea un nuovo file, scrive un set di numeri interi nel file e quindi legge i numeri interi dal file. Nell'esempio viene usata la classe FileStream per creare un nuovo file e aprire il file per la lettura o la scrittura. Nell'esempio viene usata la classe BinaryWriter per scrivere numeri interi nel file e quindi viene usata la classe BinaryReader per leggere numeri interi dal file.
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());
}
}
}
Gestire unità e cartelle in .NET
Nell'esempio seguente viene illustrato come usare le classi DirectoryInfo e Directory per creare, eliminare e gestire le cartelle. Nell'esempio viene usata la classe DirectoryInfo
per creare una nuova directory, creare una sottodirectory ed eliminare la directory. La classe DirectoryInfo
fornisce metodi per la creazione, lo spostamento e l'enumerazione in directory e sottodirectory. La classe Directory
fornisce metodi statici per la creazione, lo spostamento e l'enumerazione in directory e sottodirectory.
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());
}
}
Questo esempio usa il metodo statico GetDrives per recuperare informazioni su tutte le unità del sistema. La classe DriveInfo fornisce informazioni su un'unità, ad esempio il tipo di unità, l'etichetta, il file system e lo spazio disponibile.
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 ");
}
}
}
Codificare e decodificare stringhe con MemoryStream
Questo esempio illustra come usare la classe MemoryStream per codificare e decodificare i dati stringa. Crea prima un MemoryStream
per scrivere in modo asincrono una stringa in un flusso di memoria e quindi leggere la stringa dal flusso di memoria. La classe Encoding viene usata per convertire la stringa in una matrice di byte e quindi scrivere la matrice di byte nel flusso di memoria. Un StreamReader viene quindi usato per leggere in modo asincrono la matrice di byte dal flusso di memoria e quindi convertire nuovamente la matrice di byte in una stringa chiamando 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);
}
Nota
Per informazioni sulla conversione tra flussi .NET e flussi WinRT, vedere Procedura: eseguire la conversione tra flussi .NET e Windows Runtime.