2009-07-04 20 views
8

Posso creare una cartella compressa (con cerniera) di Windows XP usando Delphi?Creazione della cartella compressa (con cerniera) usando Delphi

+1

Cosa "Proprietà zip" ti riferisci a? potresti essere un po 'più specifico? –

+2

Avanzamento rapido 2 anni fino al 2011: Delphi XE2 ora viene fornito con una classe TZipFile integrata nell'RTL (vedere System.Zip). Forse qualcuno che ha effettivamente usato potrebbe pubblicare una risposta al riguardo qui. –

+1

Aggiunto un esempio Delphi XE2. –

risposta

5

In base a una discussione in eggheadcafe, è possibile utilizzare CreateFile Function con FILE_FLAG_BACKUP_SEMANTICS per creare una cartella compressa.

Per il percorso delle estensioni della shell, dai un'occhiata a Using Windows XP "Compressed Folder" shell extension to work with .zip files di Namespace Edanmo, che è scritto in VB.

Ho appena trovato la domanda simile posta su C++. Dai un'occhiata a Creating a ZIP file on Windows (XP/2003) in C/C++. Ho la sensazione che il percorso più semplice sia acquistare ZipForge. Vedi Zip a file in Delphi code sample.

1

È possibile utilizzare una versione da riga di comando di qualsiasi compressore come 7zip ed eseguire l'attività utilizzando ShellExecute oppure è possibile utilizzare un componente gratuito o commerciale come chiunque di these.

Avevo utilizzato ZipMaster e si comporta molto bene per il mio scopo. Non so quali siano le dimensioni, lo spazio e le prestazioni richieste.

+0

Attualmente sto usando anche questo, si adatta perfettamente alle mie esigenze. –

4

Qualche tempo fa, ho provato tutte le librerie di compressione Delphi che ho potuto trovare, e alla fine ho finito utilizzando KaZip entro il Kiril Antonov.

miei requisiti erano:

  • gratuito;
  • Open source;
  • codice Delphi nativo;
  • Nessuna dipendenza esterna (dll, exe). Il mio requisito più importante;
  • Ingombro di memoria ridotto;
  • Facile da usare;

Io lo uso principalmente per trasformare file .kml in .kmz, e lo fa incredibilmente veloce.

Ecco un esempio di come lo uso:

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; 
+0

a quale oggetto si applica l'ultimo "libero"? La mia ipotesi è KaZip, ma non ho il rep per modificare. – Argalatyr

+0

Ah, sì KaZip dovrebbe essere liberato lì .. Risolto .. Ho pulito questo codice nell'editor di testo di questa pagina per renderlo un po 'più facile da leggere .. Credo che avrei dovuto controllare se funziona ancora :) –

2

A "zip" cartella in Windows non è altro che un file .ZIP compresso utilizzando qualsiasi libreria zip standard. Le cartelle compresse sono un animale diverso e richiedono un formato disco NTFS.

Per il file "Zip", suggerisco caldamente lo Turbo Power Abbrevia, che è open source e funziona bene. Potresti voler controllare questo sito alternate se utilizzi Delphi 2009 in quanto potrebbe essere una copia più recente.

Se si desidera utilizzare l'opzione cartelle compresse, sarà necessario modificare i flag di directory sull'handle della directory.Ciò avrà un impatto solo sui nuovi file aggiunti a quella directory e non comprimerà automaticamente i file esistenti. Se si dispone di una directory esistente che si sta tentando di comprimere, rinominare ciascun file esistente e caricarlo e salvarlo sul nome originale eliminando il file originale quando è completo con ciascuno di essi. Yozey aveva un buon collegamento con la documentazione di MSDN. Ricorda solo che funziona solo con dischi formattati NTFS, quindi dovrai aggiungere un controllo per quello nel tuo codice.

3

Dai un'occhiata a questo OpenSource SynZip unit. È 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 una singola unità.

Ho appena apportato alcune modifiche per gestire i nomi dei file Unicode all'interno del contenuto Zip, non solo il set di caratteri di Win-Ansi ma tutti i caratteri Unicode. Il feedback è benvenuto

+0

puoi dare un esempio per usare 'SynZip'? da [esempio] (http://synopse.info/forum/viewtopic.php?pid=163) come comprimere una cartella? – PresleyDias

11

Se si utilizza Delphi X2, basta usare TZipFile da System.Zip:

a zip in una cartella, utilizzare:

TZipFile.ZipDirectoryContents('ZipFile.zip', 'C:\Zip\this\right\now'); 

zip file, uso:

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

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

utilizza questo per comprimere una cartella ma continua a ottenere "Il processo non può accedere al file perché è stato utilizzato da un altro processo, non è sicuro in che modo si accede? Ho liberato la lista che avevo con tutti gli iamges nella cartella. Stavo scrivendo anche io. C'è un modo per vedere che cosa sta accedendo ad esso? o un modo per chiudere ciò che mai accederà ..? grazie –

+0

@GlenMorse Dopo 3 anni ho letto questo anser.La prima funzione probabilmente non funziona. lo zip ma solo con il primo file, forse quella funzione si sta bloccando.Si usa il secondo, funziona bene –

+0

la prima versione funziona. Devi solo uscire dal tuo modo. provare qualcosa come TZipFile.ZipDirectoryContents ('.. \ ZipFile.zip', 'C: \ Zip \ this \ right \ now'); –

Problemi correlati