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