adszone.org
venerdì 20 settembre 2024
"Il modo corretto di pensare il software"
home
consulenza  vb.net  contatti 
  Visual Basic .NET
  Files, Directories, Streams
Domande

Files, Directories e Streams

Il framework .Net gestisce file e directory con le classi File e Directory. Esse hanno tutti i metodi statici e, su di essi compiono tutte le verifiche di sicurezza, pertanto il loro uso intensivo puo' appesantire le prestazioni. Per un uso frequente e' consigliato usare altre due classi che sono istanziabili: FileInfo e DirectoryInfo.

La classe File espone le seguenti categorie di metodi: Copy, Delete, Exists, Move. Esse creano, cancellano, testano l'esistenza e spostano file. GetAttributes, SetAttributes, GetCreationTime, SetCreationTime, GetLastAccessTime, SetLastAccessTime, GetLastWriteTime, SetLastWriteTime reperiscono ed impostano attributi vari. Create, CreateText, Open, OpenRead, OpenText, OpenWrite si occupano della creazione o apertura di file in varie modalita'.

Per quanto riguarda la classe Directory, i metodi CreateDirectory, Delete, Exists, Move creano, cancellano, testano l'esistenza e spostano directory. GetFiles ottiene tutti i file contenuti in una directory. GetDirectories ottiene tutti le directory contenute in una directory. GetLogicalDrives ottiene la lista di drive disponibili. GetCurrentDirectory restituisce la directory corrente.

Per lavorare con i file, dobbiamo tener presente che come al solito esistono due diversi tipi di file: i file di testo e quelli binari. La loro apertura puo' seguire un processo comune, cioe' l'utilizzo della classe FileStream. I costruttori di questa classe prendono i parametri necessari per l'apertura, quali il percorso, il modo di apertura, tipo di accesso, tipo di condivisione.

Il costruttore FileStream ci fornisce un'oggetto che, generalizzando, e' uno Stream. Esso puo' quindi essere passato ad uno di due diversi altri tipi di classi a seconda che si lavori in binario o in text. Per lavorare con un file di testo, dopo averlo individuato con FileStream, usiamo le classi StreamReader e StreamWriter. Per lavorare con un file binario usiamo, invece, le classi BinaryReader e BinaryWriter. Tra i loro costruttori, ne esiste uno che prende appunto uno Stream.

Questo, appena presentato, e' il metodo che permette di controllare maggiormente l'interfacciamento ai file. Ma, se volete, di tecniche ne esistono moltissime. Basti pensare ai metodi della classe File che gia' inglobano l'utilizzo del FileStream e forniscono metodi di apertura predefiniti come: Create, CreateText, Open, OpenRead, OpenText, OpenWrite. Questi metodi ci forniscono lo Stream voluto che poi passeremo a StreamReafer, StreamWriter, BinaryReader, BinaryWriter.

Ricapitoliamo con un paio di esempi. Mi rifersco ad un Form che contiene tre pulsanti btnLeggi, btnScrivi, btnLeggiScriviBin ed una TextBox Multiline.

Lavorare con i file di Testo

I seguenti gestori di eventi click si occupano di un file di testo. L'evento "Scrivi" crea il file di testo dati.txt e lo passa ad uno StreamWriter che ci scrive dentro dieci numeri casuali, uno per riga. L'evento "Leggi" apre lo stesso file in lettura ed iterando cerca il numero massimo per poi visualizzarlo. Notate l'utilizzo dei metodi WriteLine, ReadLine e Peek, essi appartengono agli StreamXXX.

    Private Sub btnScrivi_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnScrivi.Click
		    
        Dim rnd As New Random(), i As Integer

        Dim fs As New FileStream("dati.txt", FileMode.Create)
        Dim s As New StreamWriter(fs)

        For i = 1 To 10
            s.WriteLine(rnd.Next(1, 100))
        Next
        
        s.Close()
    End Sub

    Private Sub btnLeggi_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles btnLeggi.Click
		    
        Dim fs As New FileStream("dati.txt", FileMode.Open)
        Dim s As New StreamReader(fs)
        
        Dim max As Integer = -1, line As String, txt As String
        txt = ""
        
        While s.Peek() <> -1
            line = s.ReadLine()
            txt = txt & line & vbCrLf
            If CInt(line) > max Then max = CInt(line)
        End While
        
        s.Close()
        
        TextBox1.Text = txt
        MessageBox.Show("Massimo = " & max)
    End Sub

Lavorare con i file di Binari

Una volta creato uno Stream con FileStream, possiamo darlo in pasto contemporaneamente sia al BinaryReader che al BinaryWriter. Abbiamo cosi' un file ad accesso casuale, dove poter leggere e scrivere. Il seguente gestore di evento crea un file binario dati.bin, ci scrive dentro dieci numeri "interi" (che occupano 4 byte ciascuno), li rilegge tutti visualzziandoli nella TextBox1, quindi rilegge e visualizza quelli di posizione dispari e poi quelli di posizione pari. Lo spostamento all'interno del file avviene con il metodo Seek del Writer. La scrittura si opera con una semplice Write. Per la lettura e' importante notare che, poiche' esistono differenti tipi di variabili e quindi differenti dimensioni di allocazione, abbiamo tanti metodi quanti sono i tipi di variabili da poter leggere. Noi usiamo, ad esempio, ReadInt32 perche' sappiamo che un intero occupa 4 byte.

    
        Private Sub btnLeggiScriviBin_Click(ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles btnLeggiScriviBin.Click
        Dim rnd As New Random(), i As Integer

        Dim fs As New FileStream("dati.bin", FileMode.Create)
        Dim bw As New BinaryWriter(fs)
        Dim br As New BinaryReader(fs)

        For i = 1 To 10
            bw.Write(rnd.Next(1, 100))
        Next

        Dim txt As String = "", n As Integer

        txt = txt & "Tutti" & vbCrLf
        bw.Seek(0, SeekOrigin.Begin)
        For i = 1 To 10
            n = br.ReadInt32()
            txt = txt & CStr(n) & vbCrLf
        Next

        txt = txt & "posizione dispari" & vbCrLf
        For i = 1 To 10 Step 2
            bw.Seek((i - 1) * 4, SeekOrigin.Begin)
            n = br.ReadInt32()
            txt = txt & CStr(n) & vbCrLf
        Next

        txt = txt & "posizione pari" & vbCrLf
        For i = 2 To 10 Step 2
            bw.Seek((i - 1) * 4, SeekOrigin.Begin)
            n = br.ReadInt32()
            txt = txt & CStr(n) & vbCrLf
        Next

        TextBox1.Text = txt

        bw.Close()
        br.Close()
    End Sub

End Class
Ultimo aggiornamento 13/01/2004