Il .NET Framework offre una vastissima gamma di classi e metodi per operare qualsiasi operazioni di Input/Output e analisi di file e cartelle. Proprio per il suo scopo, il namespace che contiene tutto questo è chiamato System.IO. Sarebbe un'impresa immane quella di documentare il funzionamento di ogni membro di ogni classe del namespace in questione, quindi scriverò solamente delle direttive generali sui tipi da utilizzare in ciascuna situazione.
- IO.Directory : espone solo metodi statici che permettono la modifica, l'analisi e la creazione di cartelle sul computer. I metodi più frequentemente utilizzati sono CreateDirectory (fornito un percorso come unico parametro, crea tutte le cartelle ancora inesistenti), Delete (come primo parametro accetta il percorso dell'unica cartella da eliminare: se questa non è vuota, bisogna specificare True come secondo parametro per indicare di eseguire una pulizia ricorsiva), Exists (controlla l'esistenza di una cartella), GetDirectories (restituisce un array di stringhe contenente tutte le sottocartelle di primo livello) e GetFiles (restituisce un array di stringhe contenente tutti i files presenti nella directory data; opzionalmente si può specificare un pattern di ricerca di formato simile a quello della proprietà Filter di OpenFileDialog; ad esempio "*.dll;*.exe").
- IO.DirectoryIndo : oggetto che espone metodi d'istanza simili a quelli sopra citati. Il costruttore accetta come parametro il percorso della cartella
- IO.DriveInfo : oggetto che espone metodi d'istanza per ottenere informazioni su un particolare drive. Il costruttore accetta come parametro il nome del drive nella forma "[Lettera]:" (faccio presente che è possibile ottenere una lista dei drivder logici con la funzione IO.Directory.GetLogicalDrivers). I membri esposti sono per lo più proprietà, come AvaiableFreeSpace (lo spazio libero), DriveFormat (il formato del drivder, ad esempio FAT32), DriveType (il tipo di driver, ad esempio se rappresenta un lettore CD o un disco fisso o removibile), TotalSize (la dimensione totale) o VolumeLabel (l'etichetta associata).
- IO.File : espone solo metodi statici che permettono la modifica, l'analisi, la creazione e l'eliminazione di file sul computer. I metodi più frequentemente utilizzati sono Copy, Create, Delete, Exists, Move, Replace (rispettivamente copia, crea, elimina, controlla l'esistenza, sposta o sovrascrive un file: in tutti il primo parametro è il percorso del file). Molto utili sono anche i metodi ReadAllText, che legge e restituisce tutto il testo di un file, WriteAllText, che scrive un dato testo in un dato file, e AppendAllText, che aggiunge una dato testo a un dato file; di questi metodi esistono anche le varianti Bytes e Lines, che operano su array di bytes o di stringhe (linee di testo) anzichè su una stringa unica. Degne di nota sono infine anche le procedure Encrypt e Decrypt, che criptano e decriptano un file cosicchè solo l'utente che li ha codificati li possa leggere, e la funzione GetAttributes insieme con SetAttribute, che permettono di modificare gli attributi di un file. Da ricordare che gli attributi sono posti in un enumeratore codificato a bit.
- IO.FileInfo : oggetto che espone metodi d'istanza simili a quelli sopra citati. Il costruttore accetta come parametro il percorso del file.
- IO.Path : espone solo metodi statici per lavorare con nomi di files e directory e interagire cone i files temporanei. Molto usati
sono GetFileName e GetFileNameWithoutExtension, che restituiscono rispettivamente il nome di file con o senza estensione di un percorso completo
dato: alla stessa stregua lavorano i metodi GetDirectoryName e GetExtension che estraggono l'estensione o la directory da un percorso di file
completo. Ad esempio:
S = C:CartellaSottocartellafile.txt GetFileName(S) = file.txt GetFileNameWithoutExtension(S) = file GetDirectoryName = C:CartellaSottocartella GetExtension = .txt
GetTempFileName, invece, crea e restituisce un file temporaneo con un nome stabilito dal sistema operativo, mentre GetTempPath restituisce il nome della cartella temporanea usata correntemente. Una feature interessante è GetRandomFileName, che restituisce un nome del tutto casuale adatto per file e cartelle.
Questo programma di esempio permette di navigare nelle cartelle del computer e di ottenere informazioni sui files, usando un sistema di liste
simile (ma non uguale) a quello del vecchio Visual Basic 6. L'interfaccia del programma sarà più o meno così:
E questo il codice:
Class Form1 'Tiene traccia del drive e della cartella corrente Private CurrentDrive, CurrentDir As String 'Questa funzione permetterà di formattare le date 'in poco spazio Private Function FormatDate(ByVal D As Date) As String 'Ad esempio '"lunedì 26 novembre 2007, ore 19:97" Return D.ToString("dddd dd MMMM yyyy, ore HH:mm") End Function Private Sub lstDrive_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As EventArgs) Handles lstDrive.SelectedIndexChanged If lstDrive.SelectedIndex = -1 Then Exit Sub End If 'Procede solo se la periferica è pronta If Not (New IO.DriveInfo(lstDrive.SelectedItem).IsReady) Then MessageBox.Show("La periferica non è pronta!", "File Browser", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Exit Sub End If 'Memorizza il drive selezionato CurrentDrive = lstDrive.SelectedItem 'Quando si cambia driver, si resetta la lista delle 'cartelle quindi la cartella iniziale è uguale 'al drive CurrentDir = CurrentDrive.Clone 'Pulisce la lista delle cartelle lstDir.Items.Clear() 'Quando si seleziona un drive, carica le cartelle 'al suo interno For Each Dir As String In _ IO.Directory.GetDirectories(lstDrive.SelectedItem) lstDir.Items.Add(Dir) Next End Sub Private Sub lstDir_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As EventArgs) Handles lstDir.SelectedIndexChanged 'Solo se è eramente selezionato un elemento procede If lstDir.SelectedIndex = -1 Then Exit Sub End If 'Memorizza la cartella selezionata CurrentDir = IO.Path.Combine(CurrentDir, lstDir.SelectedItem) 'Pulisce la lista delle cartelle e dei files lstDir.Items.Clear() lstFiles.Items.Clear() 'Carica le sottocartelle, solo con il nome For Each SubDir As String In IO.Directory.GetDirectories(CurrentDir) 'Si può fare anche con le cartelle, poichè le funzione 'considera solamente il formato della stringa lstDir.Items.Add(IO.Path.GetFileName(SubDir)) Next 'Carica i files interni alla cartella, solo con il nome For Each File As String In IO.Directory.GetFiles(CurrentDir) lstFiles.Items.Add(IO.Path.GetFileName(File)) Next End Sub Private Sub lstFiles_SelectedIndexChanged(ByVal sender As Object, _ ByVal e As EventArgs) Handles lstFiles.SelectedIndexChanged If lstFiles.SelectedIndex = -1 Then Exit Sub End If 'Ottiene le informazioni relative al file 'Path.Combine combina due directory o un file e 'una directory 'per ottenere un percorso completo Dim Info As New IO.FileInfo( _ IO.Path.Combine(CurrentDir, lstFiles.SelectedItem)) lblInfo.Text = String.Format( _ "Nome: {1}{0}Data creazione: {2}{0}Ultimo accesso: {3}{0}" & _ "Ultima modifica: {4}{0}Dimensione totale: {5:N0} bytes", vbCrLf, _ Info.Name, FormatDate(Info.CreationTime), _ FormatDate(Info.LastAccessTime), FormatDate(Info.LastWriteTime), _ Info.Length) End Sub Private Sub cmdParent_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles cmdParent.Click Try 'Si reca alla directory precedente nell'ordine 'gerarchico CurrentDir = IO.Directory.GetParent(CurrentDir).FullName lstDir.Items.Clear() For Each SubDir As String In IO.Directory.GetDirectories(CurrentDir) lstDir.Items.Add(IO.Path.GetFileName(SubDir)) Next Catch Ex As Exception 'Se le directory sono le prime in ordine, si 'genera un errore MessageBox.Show("Non è possibile risalire più indietro!", _ "File Browser", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End Sub End Class