http://digilander.libero.it/Cenati

Zippare con XP

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript

         

 

 

 

 

Creare file zip usando solo le funzioni di Windows XP

Windows XP può creare e leggere in modo nativo i file compressi nel formato "zip". Può anche mostrarli come se fossero una cartella, in modo da aprirli in modo trasparente per l'utente.

Anche da uno script è possibile creare un file zip vuoto e riempirlo con i nostri file. Può servire, ad esempio, per comprimere periodicamente dei dati ed archiviarli oppure inviarli per posta elettronica.

Un file zip vuoto è solo un file che inizia con i caratteri PK seguiti da due caratteri con codice ascii 5 e 6, e con 18 caratteri "nul" (ascii 0) per terminare. Creando un file con questi caratteri, Windows lo identifica come un file zip.

Creato il file vuoto, posso copiarci dentro qualsiasi altro documento usando l'oggetto "NameSpace" che restituisce un accesso al pathname che viene specificato. Attenzione: namespace vuole un pathname completo e non solo il nome del file. Neppure se si vuole accedere ad un file posto nella stessa directory. Ecco perchè all'inizio del mio script recupero il nome completo della cartella corrente, mi serve per accedere correttamente al file zip.

Puntando all'oggetto NameSpace(FileZip) posso applicare il metodo "CopyHere" per copiare un file all'interno dello zip. Oppure posso copiarci tutti gli elementi contenuti in una diversa cartella. Questo è quanto fa la funzione "AddFolder2Zip".

Il codice riportato qui sotto fornisce tre funzioni per gestire i file zip.

La funzione CreateEmptyZip crea un file zip vuoto. Il nome viene passato come parametro.

La funzione AddFile2Zip aggiunge ad un archivio zip esistente (primo parametro) un file specifico (secondo parametro). Entrambi i file devono essere specificati con il nome completo, dal nome del drive all'estensione.

La terza funzione, AddFolder2Zip, è simile alla precedente ma copia tutti i Folder.items. Cioè copia nell'archivio tutti i file contenuti nella cartella specificata come secondo parametro.

La copia dei file impiega del tempo. Può durare pochi istanti o diversi secondi, dipende dalla dimensione e numerosità  dei file da includere nello zip. Se lo script finisce, si distruggono gli oggetti che stanno porvvedendo alla creazione del file compresso e tutto si interrompe. 

Per ovviare a questo problema bisogna che lo script rimanga in vita per il tempo sufficiente a terminare la copia. Infatti il comando Copyhere, usato nello script, avvia la copia e passa al comando successivo senza attenderne il completamento.

Una soluzione è mettere un comando di attesa (wscript.sleep 6000 attende sei secondi) che deve essere stimato secondo la dimensione dei file da comprimere. Oppure non occorre far nulla se lo script continua a fare altre cose e quindi non terminerà prima della fine della copia.

Un metodo più intelligente invece consiste nell'attendere che il file compresso aumenti di dimensione. Infatti la creazione dello zip avviene in un file temporaneo e solo alla fine della compressione c'è il trasferimento nel file definitivo. Se verifico (ogni 300 millisecondi, nell'esempio) la dimensione del file compresso posso rilevare il momento in cui supero i 22 caratteri che corrispondono ad uno zip vuoto.

La funzione "CreateEmptyZip" genera infatti un file da 22 caratteri. Quando la compressione è terminata, questo file cresce di dimensione e ciò testimonia la fine del processo. A questo punto posso essere sicuro che il lavoro è finito e posso chiudere lo script senza interrompere la compressione.

Nell'esempio riportato, questo controllo è effettuato puntando al file zip e controllandone la proprietà SIZE. Questo controllo potrebbe anche essere spostato all'interno delle funzioni che si occupano di aggiungere un file o una cartella all'archivio compresso.

Se invece è necessario comprimere diverse directory comprendendone la struttura oppure proteggendo con una password, bisogna passare ad un programma di compressione a linea di comando come 7zip, che ha numerose funzioni aggiuntive rispetto alla compressione base di Windows.

Copia il programma riportato qui sotto in un file con estensione ".vbs" oppure scarica l'archivio zip contentente lo script.

'************************************************
' File: Zip.vbs (VBScript)
' Autore: Giovanni Cenati
' Funziona con Windows XP
' Crea un file zip e vi aggiunge uno o più file.
' Sfrutta la possibilità data da Windows XP
' di gestire i files zip come se fossero cartelle.
' Funzione:
' CreateEmptyZip (nome dello zip da creare)
' (Crea un nuovo file zip vuoto o sovrascrive quello esistente)
'
' AddFile2Zip (Nome archivio zip, File da aggiungere)
' (Aggiunge un singolo file ad uno zip esistente)
'
' AddFolder2Zip (Nome archivio zip, Cartella da aggiungere all'archivio)
' (Aggiunge ad uno zip esistente il contenuto di una cartella)
'
' Creates a zip archive and adds one or more files.
' Uses Win XP native support for zip archives as folders.
'************************************************
ScriptFullName = wscript.scriptfullname
CurrentPath = Left(scriptfullname, InStrRev(ScriptFullName, "\"))

ZipFile = CurrentPath & "test.zip"
FileDaAggiungere = wscript.scriptfullname
FolderDaZippare = CurrentPath & "temp\"

'Crea un file zip vuoto.
a = CreateEmptyZip(ZipFile)
msgbox a 'Deve essere True.

'Aggiunge un file all'archivio zip appena creato.
a = AddFile2Zip (ZipFile, FileDaAggiungere)
msgbox a

'Aggiunge il contenuto di un folder all'archivio zip.
a= AddFolder2Zip (ZipFile, FolderDaZippare)

'Attende che la copia sia finita
set fso=createobject("scripting.filesystemobject")
Set h=fso.getFile(ZipFile)
do
wscript.sleep 300
loop while h.size=< 22

Function AddFile2Zip (sZipFile, sFile2Add)
'Aggiunge un file all'archivio zip esistente.
'Attenzione: di default il metodo CopyFile sovrascrive.
'NameSpace vuole un pathname completo e non solo il nome file.
On Error Resume Next
AddFile2Zip = True
Set oApp = createobject("Shell.Application")
oApp.NameSpace(sZipFile).CopyHere sFile2Add
If Err<>0 Then AddFile2Zip=False
End Function

Function CreateEmptyZip(sPathName)
'Create empty Zip File.
'Crea un file zip vuoto.
Dim fso, fp
Const ForWriting = 2 'Apre un file in scrittura.
CreateEmptyZip = True 'se tutto va bene resta true.
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set fp = fso.OpenTextFile( sPathName, ForWriting, True )
If Err <> 0 Then
Set opfs = Nothing
CreateEmptyZip=False
Exit Function 'Errore nella creazione
end if
fp.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)
If Err <> 0 Then
Set opfs = Nothing
CreateEmptyZip=False
Exit Function 'errore nella scrittura
End If
fp.Close 'Chiude il file, altrimenti non si può usare.
Set fso = Nothing
Err.Clear
End Function

Function AddFolder2Zip (ZipFile, Folder)
'Copia il contenuto di una cartella in un file zip.
'Il folder deve essere indicato con pathname completo
'e terminare con un "\"
'Zipfile deve essere indicato con pathname completo.
AddFolder2Zip=True
Set oApp = CreateObject("Shell.Application")
'Copia il contenuto della cartella nello zip.
Set oFolder = oApp.NameSpace(Folder)
If Not oFolder Is Nothing Then
oApp.NameSpace(ZipFile).CopyHere oFolder.Items
End If
If Err <>0 Then AddFolder2Zip=False
End Function

E per estrarre files da un archivio zip?

Analogamente a come si copiano dei files in una cartella compressa, si possono estrarre in una cartella normale.

Anche in questo caso è necessario che ZipFile sia indicato come pathname completo

UnzipFolder "c:\dati\"
ZipFile "C:\dati\archivio.zip"
Set oApp = CreateObject("Shell.Application")
oApp.Namespace(UnzipFolder).CopyHere oApp.Namespace(ZipFile).Items

Giovanni Cenati

 

 

 

© Cenati Giovanni 2004/2010 - http://digilander.libero.it/Cenati - Reventlov at Katamail com

home | e-mail e contatti | Introduzione al sito | Cosa e' e come imparare VbScript