- Comprimere e decomprimere archivi ZIP -
 
COSA SERVE PER QUESTO TUTORIAL
Download | Chiedi sul FORUM | Glossario Basica conoscenza di VB .NET
La libreria SharpZipLib

COME LAVORARE CON ARCHIVI ZIP
Un programma che compie le più comuni operazioni con gli archivi ZIP.

Codice:


'Potete trovare la versione più recente di SharpZipLib all'indirizzo:
'http://www.icsharpcode.net/opensource/sharpziplib/
Imports ICSharpCode.SharpZipLib.Zip

Module ZipAndUnzip
    
    Sub Main()
        Dim strParameters As String() = Environment.GetCommandLineArgs()

        If strParameters.Length < 2 OrElse strParameters(1) = "-?" OrElse strParameters(1) = "-h" OrElse _
            strParameters(1) = "--help" Then

            Console.WriteLine("ZipAndUnzip.exe archvioZip comando opzioni")
            Console.WriteLine()
            Console.WriteLine("-x, --extract [destinazione] [filtro]")
            Console.WriteLine(vbTab & "Estrae tutti i file nell'archivio in nella " & _
                "cartella specificata o in quella corrente. È possibile impostare " & _
                "un filtro, ad esempio *.txt.")
            Console.WriteLine("-c, --compress [cartella] [filtro]")
            Console.WriteLine(vbTab & "Comprime tutti i file e le sottocartelle della " & _
                "cartella specificata nell'archivio. È possibile impostare un filtro, " & _
                "ad esempio *.txt.")
            Console.WriteLine("-cf, --compress-files file1 [file2 file3 ...]")
            Console.WriteLine(vbTab & "Aggiunge i file specificati all'archivio.")
            Console.WriteLine("-xf, --extract-files file1 [file2 file3 ...]")
            Console.WriteLine(vbTab & "Estrae i file specificati dall'archivio e li " & _
                "scrive nella cartella corrente.")
            Console.WriteLine("-s, --set-comment commento")
            Console.WriteLine(vbTab & "Imposta il commento all'archivio.")
            Console.WriteLine("-i, --info")
            Console.WriteLine(vbTab & "Mostra le informazioni sull'archivio.")
            Console.WriteLine("-t, --test")
            Console.WriteLine(vbTab & "Testa se l'archivio è danneggiato.")
            Console.WriteLine("-h, -?, --help")
            Console.WriteLine(vbTab & "Mostra questa guida.")
            Return
        ElseIf strParameters.Length < 3 Then
            Console.WriteLine("Parametri insufficenti.")
            Return
        End If
        Dim strZipFile As String = strParameters(1)

        Select Case strParameters(2)

            Case "-x", "--extract"
                'Estrazione dell'intero archivio

                'Cartella di destinazione
                Dim strDestination As String = Environment.CurrentDirectory
                If strParameters.Length > 3 Then strDestination = strParameters(3)

                'Filtro sui file (ad esempio *.txt)
                Dim strFilter As String = Nothing
                If strParameters.Length > 4 Then strFilter = strParameters(4)

                'Creiamo l'oggetto FastZip
                Dim fszExtractor As New FastZip()
                'Estraiamo i file usando i parametri ricevuti
                fszExtractor.ExtractZip(strZipFile, strDestination, strFilter)

            Case "-c", "--compress"
                'Compressione di un'intera cartella

                'Cartella da comprimere
                Dim strSource As String = Environment.CurrentDirectory
                If strParameters.Length > 3 Then strSource = strParameters(3)

                'Filtro sui file (ad esempio *.txt)
                Dim strFilter As String = Nothing
                If strParameters.Length > 4 Then strFilter = strParameters(4)

                'Creiamo l'oggetto FastZip
                Dim fszCompressor As New FastZip()
                'Comprimiamo la cartella con i parametri ricevuti e ricorsivamente 
                'per le sottocartelle
                fszCompressor.CreateZip(strZipFile, strSource, True, strFilter)

            Case "-cf", "--compress-files"
                'Aggiunge all'archivio alcuni file specificati

                Dim zipFile As ZipFile
                'Creiamo l'oggetto ZipFile, se non esiste lo criamo
                If IO.File.Exists(strZipFile) Then
                    zipFile = New ZipFile(strZipFile)
                Else
                    zipFile = zipFile.Create(strZipFile)
                End If

                'Iniziamo la modifica dell'archivio
                zipFile.BeginUpdate()
                'Per ogni file chiamiamo il metodo Add
                For C1 As Integer = 3 To strParameters.Length - 1
                    Console.WriteLine(String.Format("Aggiungo {0}", strParameters(C1)))
                    zipFile.Add(strParameters(C1))
                Next C1
                'Apportiamo le modifiche
                zipFile.CommitUpdate()

            Case "-xf", "--extract-files"
                'Estrae dall'archivio alcuni file specifici

                'Apriamo l'archivio
                Dim zipFile As New ZipFile(strZipFile)

                For C1 As Integer = 3 To strParameters.Length - 1
                    Console.WriteLine(String.Format("Estraggo {0}", strParameters(C1)))

                    'Cerchiamo il file nell'archivio
                    Dim intIndex As Integer = zipFile.FindEntry(strParameters(C1), True)

                    If intIndex = -1 Then
                        'Il file non è presente
                        Console.WriteLine("Non trovato.")
                    Else
                        'Leggiamo il file decompresso con lo Stream restituito da 
                        'GetInputStream
                        Dim stmInput As IO.Stream = zipFile.GetInputStream(intIndex)

                        'Se la cartella di destinazione non esiste la creiamo
                        Dim strFolder As String = _
                            IO.Path.GetDirectoryName(IO.Path.GetFullPath(strParameters(C1)))

                        If Not IO.Directory.Exists(strFolder) Then _
                            IO.Directory.CreateDirectory(strFolder)

                        'Apriamo il file di destinazione
                        Dim stmOutput As New IO.FileStream(strParameters(C1), _
                            IO.FileMode.OpenOrCreate)

                        'Trasferiamo i dati da uno Stream all'altro
                        StreamToStream(stmInput, stmOutput)

                    End If
                Next C1

            Case "-s", "--set-comment"
                'Imposta il commento dell'archivio

                'Il commento da impostare
                Dim strComment As String = String.Empty
                If strParameters.Length > 4 Then strComment = strParameters(3)

                'Apriamo l'archivio
                Dim zipFile As New ZipFile(strZipFile)
                'Iniziamo l'aggiornamento
                zipFile.BeginUpdate()
                'Impostiamo il commento
                zipFile.SetComment(strComment)
                'Effettuiamo la modifica
                zipFile.CommitUpdate()

            Case "-i", "--info"
                'Stampiamo informazioni sull'archivio

                'Apriamo l'archivio
                Dim zipFile As New ZipFile(strZipFile)

                'Scriviamo il commento
                Console.WriteLine("Commento: " & zipFile.ZipFileComment)

                'Scriviamo la lista dei file
                Console.WriteLine("File:")
                For Each zpeEntry As ZipEntry In zipFile
                    Console.WriteLine(String.Format("{0} ({1})", zpeEntry.Name, zpeEntry.Crc))
                Next zpeEntry

            Case "-t", "--test"
                'Test dell'archivio

                'Apriamo l'archivio
                Dim zipFile As New ZipFile(strZipFile)

                'Chiamiamo il metodo TestArchive
                If zipFile.TestArchive(True) Then
                    Console.WriteLine("Archivio corretto.")
                Else
                    Console.WriteLine("Archivio corrotto.")
                End If

        End Select

        Console.WriteLine("Operazione completata.")
    End Sub

    Public Sub StreamToStream(ByVal stmInput As IO.Stream, ByVal stmOutput As IO.Stream)

        Dim bytBuffer(1023) As Byte
        Dim intReadBytes As Integer = stmInput.Read(bytBuffer, 0, 1024)

        Do While intReadBytes > 0
            stmOutput.Write(bytBuffer, 0, intReadBytes)
            intReadBytes = stmInput.Read(bytBuffer, 0, 1024)
        Loop
        stmInput.Close()
        stmOutput.Close()

    End Sub

End Module

 
<< INDIETRO by VeNoM00