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