toutes les fonctions pour créer un fichier zip de répertoire / fichier sur vista avec Delphi 2009

StackOverflow https://stackoverflow.com/questions/1634258

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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top