Delphi XE2 – Native compression support “ZIP” & “UNZIP”
In questi giorni comincio a metter mano su questo nuovo tool che Synaptica ha acquistato, e usandolo un pochino si scoprono belle cose. Tra cui il fatto che Embarcadero ha integrato delle funzioni cross per il supporto della compressione Zip direttamente nella RTL library. Nella libreria “System.Zip” sono presenti diversi metodi per gestire la compressione su file o stream (anche direttamente in memoria).
Di seguito un piccolissimo esempio di decompressione veloce, dove al momento dell’esecuzione del programma devo verificare la presenza di una JVM sul sistema e nel caso non ci sia devo scaricare da una versione portabile della jvm per eseguire un applicativo java. La jvm portabile è ovviamente in uno zip file e quindi ho anche la necessità di decomprimere la cartella. Per decomprimere la cartella sfutto la classe TZipFile e i metodi IsValid e ExtractZipFile che rispettivamente servono a verificare che il file sia un file valido e il secondo avvia una estrazione ricorsiva (estrae tutte le cartelle contenute nel file).
Di seguito riporto il metodo implementato :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
{$R *.fmx} uses windows, shellAPI, System.Zip; procedure TForm1.dload; Var fs : TMemoryStream; go : Boolean; ldate, cdate : TDateTime; ts : TStringList; zf: TZipFile; path : String; begin go := True; ts := TStringList.Create; try path := ExtractFilePath(ParamStr(0)) + 'portable-jvm' ; try if javahome='' then // controllo di non avere già la versione portable if not DirectoryExists(path) then begin gbdload.Text := 'Download jvm'; fs := TmemoryStream.Create; Http.Get('http:/xxxxxxxxxx.xxx/portable-jvm.zip',fs); fs.Position := 0; fs.SaveToFile('.\portable-jvm.zip'); fs.free; zf := TZipFile.Create; if zf.IsValid('portable-jvm.zip') then begin //ForceDirectories(path); zf.ExtractZipFile('portable-jvm.zip',ExtractFilePath(ParamStr(0))); end; zf.Close; zf.Free; end; javahome := path; except end; |