Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Guida al Visual Basic .NET - Il Filesystem  Gestire files e cartelle

Guida al Visual Basic .NET

Capitolo 84° - Il Filesystem Gestire files e cartelle

<< Precedente Prossimo >>

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.

 

Esempio: File Browser

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ì:

FileSystemBrowser.jpg
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 
<< Precedente Prossimo >>
A proposito dell'autore

Programmatore e analista .NET 2005/2008/2010 (in particolare C# e VB.NET), anche nell'implementazione Mono per Linux. Conoscenze approfondite di Pascal, PHP, XML, HTML 4.01/5, CSS 2.1/3, Javascript (e jQuery). Conoscenze buone di C, LUA, GML, Ruby, XNA, AJAX e Assembly 68000. Competenze basilari di C++, SQL, Hlsl, Java.