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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top