12
votes

Création de dossier compressé (zippé) à l'aide de Delphi

Puis-je créer un dossier comprimé de Windows XP (zippé) à l'aide de Delphi?


3 commentaires

Quelle "propriété zip" fais-vous référence? Pouvez-vous être un peu plus précis?


Des questions similaires aux réponses pertinentes: Comment comment -do-i-compress-multi-fichiers-multi-fichiers-en-a-archive-with-delphi Utilisation-7zip-de-Delphi


Avance rapide 2 ans à 2011: Delphi Xe2 est maintenant expédié avec une classe Tzipfile intégrée à la RTL (voir System.zip). Peut-être que quelqu'un qui a réellement utilisé cela pourrait poster une réponse à ce sujet ici.


9 Réponses :


5
votes

Selon un fil dans Eggheadcafe , vous pouvez utiliser < Un href = "http://msdn.microsoft.com/en-us/library/aa363858%28vs.85%29.aspx" rel = "Nofollow Noreferrer"> Fonction Creeefile avec File_flag_Backup_Semantics Pour créer un dossier compressé.

Pour la route Extensions Shell, jetez un coup d'œil à Utilisation du dossier compressé Windows XP " "Extension de Shell pour fonctionner avec des fichiers .zip par NAMESPace EDANMO, qui est écrit en VB.

Je viens de trouver la question similaire posée sur C ++. Jetez un coup d'œil à Création d'un fichier zip sous Windows (XP / 2003 ) en C / C ++ . J'ai le sentiment que l'itinéraire la plus facile achète ZIPFORGE. Voir ZIP Un fichier dans le code DELPHI échantillon .


0 commentaires

1
votes

Vous pouvez utiliser une version de ligne de commande de tout compresseur comme 7zip et faire le Tâche à l'aide de Shellexecute, ou vous pouvez utiliser un composant gratuit ou commercial comme quiconque de ces < / a>.

J'avais utilisé zipmaster et cela se comporte très bien à mon objectif. Je ne sais pas quels sont vos besoins de taille, d'espace et de performance.


1 commentaires

Je l'utilise actuellement aussi, convient à mes besoins.



3
votes

Vous pouvez utiliser TURBOPOWER ABBREVIA qui est maintenant open source.


0 commentaires

1
votes

4
votes

Il y a quelque temps, j'ai essayé toutes les bibliothèques de compression DELPHI que je pouvais trouver et, éventuellement, j'ai fini par utiliser Kazip par Kiril Antonov .

Mes exigences étaient : p>

  • GRATUITEMENT; LI>
  • open source; li>
  • Native Delphi Code; Li>
  • Aucune dépendance externe (DLL, EXE). Mon exigence la plus importante; li>
  • Petite empreinte mémoire; Li>
  • facile à utiliser; li> ul>

    Je l'utilise principalement pour activer des fichiers .kml en .kmz, et cela le fait incroyablement rapide. P>

    Voici un exemple de comment je l'utilise: P>

    uses
      KaZip;
    
    ...
    
    // replaces a .kml file with a .kmz file
    procedure KmlToKmz(const aFileName: string);
    var
      FS: TFileStream;
      KaZip:TKaZip;
      KmzFileName:TFileName;
    begin
      KmzFileName := ChangeFileExt(aFileName, '.kmz');
      KaZip := TKaZip.Create(nil);
      try
        // create an empty zipfile with .kmz extension:
        FS := TFileStream.Create(KmzFileName, fmOpenReadWrite or FmCreate);
        try
          KaZip.CreateZip(FS);
        finally
          FS.Free;
        end;        
    
        KaZip.Open(KmzFileName); // Open the new .kmz zipfile
        KaZip.Entries.AddFile(aFileName); // add the .kml
        KaZip.Close; 
        DeleteFile(aFileName); // delete the .kml
      finally
        KaZip.Free;
      end;
    end;
    


2 commentaires

à quel objet est-il final "libre"? Je suppose que Kazip, mais je n'ai pas le représentant à éditer.


Ah, oui kazip devrait être libéré .. corrigé. J'ai nettoyé ce code dans l'éditeur de texte de cette page pour le rendre un peu plus facile à lire .. Je suppose que j'aurais dû vérifier si cela fonctionne toujours :)



2
votes

Un dossier "zippé" dans Windows n'est rien de plus qu'un fichier .zip compressé à l'aide de n'importe quelle bibliothèque ZIP standard. Les dossiers compressés sont un animal différent et nécessitent un format de disque NTFS.

pour le fichier "zip", je suggère fortement le Turbo Power AbRevia , qui est ouverte source et fonctionne bien. Vous voudrez peut-être vérifier cette Alternate Site Si vous utilisez Delphi 2009, car il s'agissait d'une copie plus récente .

Si vous souhaitez utiliser l'option Dossiers compressée, vous devez modifier les indicateurs d'annuaire de la poignée de répertoire. Cela n'aura qu'un impact sur les nouveaux fichiers ajoutés à ce répertoire et ne compressera pas automatiquement les fichiers existants. Si vous avez un répertoire existant, vous essayez de compresser, puis renommez chaque fichier existant, puis chargez-le et enregistrez-le sur le nom d'origine Suppression du fichier d'origine lorsque vous remplissez chacun. Yozey a eu un bon lien vers le Documentation MSDN . N'oubliez pas que cela ne fonctionne que avec les disques formatés NTFS, vous devrez donc ajouter un chèque pour cela dans votre code.


0 commentaires

4
votes

Jetez un oeil à ce Unité Synzip OpenSource . Il est encore plus rapide de la décompression que l'unité par défaut expédiée avec Delphi et générera un EXE plus petit (les tables CRC sont créées au démarrage).

Aucune DLL externe n'est nécessaire. Travaille de Delphi 6 jusqu'à XE. Pas de problème avec la version Unicode de Delphi. Tout dans une seule unité.

Je viens de faire des modifications pour gérer les noms de fichiers Unicode à l'intérieur du contenu zip, non seulement Win-ansi Charset, mais également des caractères unicodes. Les commentaires sont les bienvenus.


1 commentaires

Pouvez-vous donner un exemple pour utiliser synzip ? de exemple Comment connecter un dossier?



19
votes

Si vous utilisez DELPHI X2, utilisez simplement Tzipfile à partir de System.Zip:

Po Dossier, utilisez: P>

Zip := TZipFile.Create;
try
  Zip.Open('ZipFile.zip', zmWrite);

  Zip.Add('FileToBeZipped.txt');
  Zip.Add('ThisWillBeCompressedAgainForSureAndBecomeSmaller.zip');
finally
  Zip.Free;
end


4 commentaires

Utilisation de cela pour zip un dossier, mais continuez à obtenir "le processus ne peut pas accéder au fichier car il est utilisé par un autre processus. Je ne sais pas comment il est accessible? Je libère la liste que j'avais avec tous les iamges dans le dossier. Gratuit le fichier ini i a été réparé aussi. Toute façon de voir ce qui y est accès? Ou tout moyen de fermer ce qui l'accède ..? Merci


@Glenmorse après 3 ans, j'ai lu cet anser. La première fonction ne fonctionne probablement pas. Cela génère le zip mais uniquement avec le premier fichier, peut-être que cette fonction se bloque elle-même. Utilisez la deuxième fois, cela fonctionne bien.


La première version fonctionne. Vous avez juste besoin de sortir de votre façon. essayez quelque chose comme zipfile.zip annuaire contenu ('.. \ zipfile.zip', 'c: \ zip \ this \ droite \ maintenant');


En utilisant Delphi 10.3, compressez un dossier lorsque je ferme mon application, il se bloque. Il ne craignait pas avant d'ajouter cela. Notez que je le fais aussi à partir d'un fil. Je reçois un fichier zip à la fin et le code passe avec succès. Juste, quand je termine l'application, il reste coincé à l'arrière-plan ...



0
votes

La méthode Tzipfile.ZipDirectoryContoires n'a pas fonctionné pour moi, j'ai donc créé ma propre implémentation en utilisant tzipfile.add (). Je pose ici ici si quelqu'un en a besoin. XXX


0 commentaires