eventuali funzioni per creare file zip di directory / file su Vista con Delphi 2009
-
06-07-2019 - |
Domanda
Sto cercando un metodo semplice per comprimere e comprimere con Delphi. Ho già esaminato i componenti di torry delphi: http://www.torry.net /pages.php?s=99 . Sembrano tutti come se volessero realizzare ciò che voglio, tuttavia alcuni svantaggi nell'usarli è che nessuno di loro funziona a Delphi 2009 e sono molto complessi, il che mi rende difficile portarli a Delphi 2009. E inoltre, la documentazione su sono scarsi, almeno per me. Ho bisogno di funzionalità di base per zippare senza il sovraccarico di usare un sacco di DLL. La mia ricerca mi ha portato a FSCTL_SET_COMPRESSION che pensavo avrebbe risolto il problema, ma sfortunatamente anche questo non ha funzionato. CREATEFILE sembrava promettente, fino a quando non l'ho provato ha prodotto lo stesso risultato di FSCTL_SET ... So che ci sono alcune funzionalità di compressione nativa limitata su Windows. Ad esempio, se si fa clic con il tasto destro su un file o una cartella e si seleziona - > sendTo - > cartella zippata, viene creato in modo intelligente un archivio zippato. Penso che se potessi accedere a quella funzionalità da Delphi sarebbe una soluzione. Da un lato, Linux ha le sue funzioni zippate native che possono essere usate in questo modo?
Soluzione
L'eccellente abbreviazione di TurboPower può essere scaricata per D2009 qui , il supporto D2010 è in corso e già disponibile in svn secondo il loro forum .
Abbrevia era un prodotto commerciale (per $$$), il che significa che la documentazione è abbastanza completa.
Altri suggerimenti
Uso Zipforge. Perché ci sono problemi nel portarli su D2009? È a causa del 64 bit ??
Ecco un codice di esempio
procedure ZipIt;
var
Archiver: TZipForge;
FileName: String;
begin
try
Archiver:= TZipForge.create(self);
with Archiver do begin
FileName := 'c:\temp\myzip.zip';
// Create a new archive file
OpenArchive(fmCreate);
// Set path to folder with some text files to BaseDir
BaseDir := 'c:\temp\';
// Add all files and directories from 'C:\SOURCE_FOLDER' to the archive
AddFiles('myfiletozip.txt');
// Close the archive
CloseArchive;
end;
finally
Archiver.Free;
end;
end;
Se puoi " fai " COM da Delphi, quindi puoi sfruttare la funzionalità zip integrata della shell di Windows. Ti dà una buona capacità di base.
In VBScript è simile al seguente:
Sub CreateZip(pathToZipFile, dirToZip)
WScript.Echo "Creating zip (" & pathToZipFile & ") from folder (" & dirToZip & ")"
Dim fso
Set fso= Wscript.CreateObject("Scripting.FileSystemObject")
If fso.FileExists(pathToZipFile) Then
WScript.Echo "That zip file already exists - deleting it."
fso.DeleteFile pathToZipFile
End If
If Not fso.FolderExists(dirToZip) Then
WScript.Echo "The directory to zip does not exist."
Exit Sub
End If
NewZip pathToZipFile
dim sa
set sa = CreateObject("Shell.Application")
Dim zip
Set zip = sa.NameSpace(pathToZipFile)
WScript.Echo "opening dir (" & dirToZip & ")"
Dim d
Set d = sa.NameSpace(dirToZip)
For Each s In d.items
WScript.Echo s
Next
' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
' ===============================================================
' 4 = do not display a progress box
' 16 = Respond with "Yes to All" for any dialog box that is displayed.
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified.
' 256 = Display a progress dialog box but do not show the file names.
' 2048 = Version 4.71. Do not copy the security attributes of the file.
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.
WScript.Echo "copying files..."
zip.CopyHere d.items, 4
' wait until finished
sLoop = 0
Do Until d.Items.Count <= zip.Items.Count
Wscript.Sleep(1000)
Loop
End Sub
COM ti consente inoltre di utilizzare DotNetZip , che è un download gratuito, che include zip crittografate con password, zip64, archivi autoestraenti, unicode, zip con spanning e altre cose.
Personalmente uso VCL Zip che funziona perfettamente con D2009 e D2010. costa $ 120 al momento di questo post, ma è molto semplice, flessibile e soprattutto VELOCE.
Dai un'occhiata a VCLZIP e scarica il percorso se sei interessato
codice saggio:
VCLZip1.ZipName := ‘myfiles.zip’;
VCLZip1.FilesList.add(‘c:\mydirectory\*.*’);
VCLZip1.Zip;
è tutto ciò che serve per uno zip di base, puoi ovviamente impostare livelli di compressione, strutture di directory, stream zip, decomprimere stream e molto altro.
Spero che questo sia di qualche aiuto.
RE
Dai un'occhiata a questa unità OpenSource SynZip . È ancora più veloce per la decompressione rispetto all'unità predefinita fornita con Delphi e genererà un exe più piccolo (le tabelle crc vengono create all'avvio).
Non è necessaria alcuna dll esterna. Funziona da Delphi 6 fino a XE. Nessun problema con la versione Unicode di Delphi. Tutto in un'unica unità.
Ho appena apportato alcune modifiche per gestire i nomi dei file Unicode all'interno del contenuto Zip, non solo il set di caratteri Win-Ansi ma tutti i caratteri Unicode. Il feedback è il benvenuto.