Il capitolo I/O si articola in 5 temi che vedrò di trattare in post specifici:
1) Classi per la gestione/navigazione del file system,
2) Classi per la gestione di flussi (stream) di byte,
3) Classi per leggere e scrivere dati dalle applicazioni .NET,
4) Classi per comprimere streams,
5) Isolated storage,
Le classi per la gestione del file system si trovano nel namespace System.IO, esse si dividono in classi informative e di utilità.
La maggior parte delle classi informative derivano da FileSystemInfo (FileInfo, DirectoryInfo) che contiene metodi e proprietà tramite le quali è possibile: sapere se un file o directory esiste, conoscere l’estensione, conoscere gli attributi (read only, archive, ecc), conoscere le date dell’ultimo accesso.
La classe FileInfo ha i seguenti membri (elenco i principali):
- Directory: ottenere l’oggetto di tipo DirectoryInfo che rappresenta la directory che contiene il file,
- Length: La lunghezza del file,
- IsReadOnly: se il file è in readonly,
- CreateText/OpenText/AppendText: crea/apre/aggiunge testo al file usando uno StreamWriter,
- CopyTo/MoveTo: copia/muove il file in una nuova locazione,
- Create/Open/OpenWrite/OpenRead: crea/apre/”apre in scrittura”/”apre in sola lettura” un file,
- Decrypt/Encrypt: beh si capisce
- Replace: sostituisce un file con le info presenti nell’oggetto FileInfo corrente,
La classe DirectoryInfo manipola e gestisce le diretory, i suoi membri sono:
- Parent/Root: per conoscere la directory padre/root,
- Create/CreateSubdirectiry: per creare una directory/sottodirectory
- GetDirectories/GetFiles: restituisce un array di DirectoryInfo/FileInfo che rappresenta le sottodirectory/files del DirectoryInfo corrente,
- GetFileSystemInfos: è simile ai metodi GetDirectory/GetFiles ma restituisce un array di FileSystemInfo che contiene entrambi files e directory contenuti dal DirectoryInfo corrente,
- MoveTo: per spostare tutto il contenuto di una directory
Il seguente frammento di codice enumera tutti i files contenuti nella directory “D:\Test”.
DirectoryInfo myDir = new DirectoryInfo(@"D:\Test");
FileInfo[] files = myDir.GetFiles();
foreach (FileInfo file in files)
{
Console.WriteLine("{0}", file.Name);
}
Vi è poi la classe DriveInfo per accedere alle informazioni riguardanti i drives. I principali membri sono:
- AvailableFreeSpace/TotalFreeSpace/TotalSize: ritorna lo spazio disponibile tenendo conto della quota utente/spazio disponibile NON tenendo conto della quota utente/spazio totale.
- DriveFormat: Format del file system (NTFS, FAT, ecc);
- DriveType: Enumerativo DriveType (CDROM, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown)
- RootDirectory: ritorna l’oggetto DirectoryInfo che rappresenta la directory root
- IsReady: importante questa proprietà soprattutto per i CD-ROM e le unità removibili; prima infatti di usare proprietà come DriveFormat, RootDirectory, ecc bisogna controllare che il drive sia pronto (Name e DriveFormat invece possono essere sempre lette).
Vi inoltre il metodo statico GetDrives() che ritorna un array DriveInfo di tutti i drives del sistema.
Continuiamo la carellata con la classe Path. Da notare che si tratta di una classe statica, dunque potremmo definirla come un insieme di metodi per manipolare i path (i percorsi: stringhe usate per indicare la posizione di file e directory all’interno del file system).
- ChangeExtension: dato un path viene ritornato un nuovo path con la nuova estensione di file indicata,
- Combine: combinazione di due path
- GetDirectoryName/GetFileName/GetFileNameWithoutExtension/
GetExtension/GetFullPath/GetPathRoot: il nome dei metodi è autoesplicativo
- GetRandomFileName: per generare un nome di file a caso (es. “y5pj1wjl.u40”). Di primo avviso l’ho pensato utile per i file temporanei ma forse meglio usare il metodo seguente.
- GetTempFileName: simile al precedente genera un path completo nella locazione “Local Settings” dell’utente (es. “C:\Documents and Settings\<<nome utente>>a\Local Settings\Temp\tmp38C.tmp”);
- GetTempPath: ritorna la posizione della directory temp per l’utente.
Per concludere la classe FileSystemWatcher con la quale è possibile monitorare i cambiamenti al file system.
- EnableRaisingEvents: consente di abilitare/disabilitare il “watching”,
- Filter: consente di impostare quali tipi di file devono essere monitorati (non impostanto niente, tutti i files vengono monitorati),
- IncludeSubdirectories: specifica se monitorare le subdirectory o solo la directory specificata nella proprietà Path,
- NotifyFilter: consente di specificare quale evento riportare (cancellazione, aggiunta, modifica, rinomina),
- Path: specifica quale directory monitorare,
- WaitForChanged: è un metodo che consente di monitorare la directory in maniera sincrona; una volta che l’esecuzione del metodo è finita, esso ritorna una struttura contenente i cambiamenti riscontrati.
Gli eventi riportati sono:
- Changed: directory o file modificati
- Created: directory o file creati
- Deleted: directory o file cancellati
- Renamed: directory o file rinominati
Questo un piccolo esempio che monitora il path C:\ e che riporta ogni file/directory creata e ogni file/directory rinominata.
class Program
{
static void Main(string[] args)
{
FileSystemWatcher fsWatcher = new FileSystemWatcher(@"c:\");
fsWatcher.Renamed += new RenamedEventHandler(fsWatcher_Renamed);
fsWatcher.Created += new FileSystemEventHandler(fsWatcher_Created);
fsWatcher.EnableRaisingEvents = true;
Console.ReadLine();
}
static void fsWatcher_Renamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("Renamed old name {0} to {1}", e.OldName, e.FullPath);
}
static void fsWatcher_Created(object sender, FileSystemEventArgs e)
{
Console.WriteLine("Created {0}", e.FullPath);
}
}
Da notare che se il path non è corretto non viene riportato nessun errore e niente succede (io ad esempio invece di “C:\” avevo messo “C:”).
Nel prossimo post vedremo come trattare il contenuto dei files e i flussi dati in generale. A presto.