toutes les fonctions pour créer un fichier zip de répertoire / fichier sur vista avec Delphi 2009
-
06-07-2019 - |
Question
Je recherche une méthode simple pour compresser et compresser avec Delphi. J'ai déjà examiné les composants de torry delphi: http://www.torry.net /pages.php?s=99 . Ils semblent tous vouloir réaliser ce que je veux, cependant quelques inconvénients à leur utilisation sont qu’aucun d’entre eux ne tourne sous Delphi 2009 et est très complexe, ce qui rend difficile pour moi de les porter à Delphes 2009. Et d’ailleurs, la documentation sur ils sont rares, du moins pour moi. J'ai besoin de fonctionnalités de base de compression sans la surcharge liée à l'utilisation de plusieurs DLL. Ma quête m'a conduit à FSCTL_SET_COMPRESSION qui, à mon avis, aurait pu résoudre le problème, mais malheureusement, cela n'a pas fonctionné non plus. CREATEFILE semblait prometteur, jusqu'à ce que j'essaie de produire le même résultat que FSCTL_SET ... Je sais qu'il existe une capacité de compression de code native limitée sur Windows. Par exemple, si vous cliquez avec le bouton droit sur un fichier ou un dossier et sélectionnez - > sendTo - > dossier compressé, une archive compressée est créée de manière intelligente. Je pense que si je pouvais accéder à cette capacité depuis Delphi, ce serait une solution. Par ailleurs, Linux a-t-il ses propres fonctions de compression natives qui peuvent être utilisées de la même manière?
La solution
L'excellent Abbrevia de TurboPower peut être téléchargé pour D2009 ici , la prise en charge de D2010 est en cours et est déjà disponible dans svn en fonction de leur forum .
Abbrevia était un produit commercial (pour $$$), ce qui signifie que la documentation est assez complète.
Autres conseils
J'utilise Zipforge. Pourquoi y a-t-il des problèmes pour les porter sur D2009? Est-ce à cause du 64 bits?
Voici un exemple de code
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;
Si vous le pouvez, faites " COM de Delphi, vous pouvez alors tirer parti de la fonctionnalité zip intégrée du shell Windows. Cela vous donne de bonnes capacités de base.
Dans VBScript, cela ressemble à ceci:
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 vous invite également à utiliser DotNetZip , qui est un téléchargement gratuit, qui effectue des zips chiffrés avec un mot de passe, zip64, archives auto-extractibles, unicode, zips étendus, etc.
Personnellement, j'utilise VCL Zip qui fonctionne parfaitement avec D2009 et D2010. cela coûte 120 $ au moment de cet article, mais est très simple, flexible et surtout rapide.
Consultez VCLZIP et téléchargez le parcours si vous le souhaitez
code sage:
VCLZip1.ZipName := ‘myfiles.zip’;
VCLZip1.FilesList.add(‘c:\mydirectory\*.*’);
VCLZip1.Zip;
est tout ce dont vous avez besoin pour un zip de base, vous pouvez bien sûr définir des niveaux de compression, des structures de répertoires, des flux zip, des flux décompressés et bien plus encore.
J'espère que cela vous aidera.
RE
Jetez un coup d'oeil à cette unité OpenSource SynZip . La décompression est encore plus rapide que l’unité fournie par défaut avec Delphi et génère un fichier exe plus petit (des tables crc sont créées au démarrage).
Aucune dll externe n'est nécessaire. Fonctionne de Delphi 6 à XE. Aucun problème avec la version Unicode de Delphi. Le tout dans une seule unité.
Je viens d'apporter quelques modifications pour gérer les noms de fichiers Unicode dans le contenu Zip, non seulement le jeu de caractères Win-Ansi, mais également tous les caractères Unicode. Vos commentaires sont les bienvenus.