Pregunta

Estoy buscando un método simple de comprimir y comprimir con delphi. Ya he visto los componentes en torry delphi: http://www.torry.net /pages.php?s=99 . Parece que todos lograrían lo que quiero, sin embargo, algunas desventajas de usarlos es que ninguno de ellos se ejecuta en Delphi 2009 y es muy complejo, lo que me dificulta portarlos a Delphi 2009. Y además, la documentación sobre ellos son escasos, bueno al menos para mí. Necesito la funcionalidad básica de compresión sin la sobrecarga de usar un montón de archivos DLL. Mi búsqueda me llevó a FSCTL_SET_COMPRESSION, que pensé que habría resuelto el problema, pero desafortunadamente esto tampoco funcionó. CREATEFILE parecía prometedor, hasta que lo intenté arrojó el mismo resultado que FSCTL_SET ... Sé que hay una capacidad limitada de compresión nativa en Windows. Por ejemplo, si uno hace clic derecho en un archivo o carpeta y selecciona - > sendTo - > carpeta comprimida, se crea de forma inteligente un archivo comprimido. Creo que si pudiera acceder a esa capacidad desde Delphi, sería una solución. En un tema secundario, ¿Linux tiene sus propias funciones nativas de compresión que se pueden usar de manera similar?

¿Fue útil?

Solución

La excelente abreviatura de TurboPower se puede descargar para D2009 aquí , el soporte D2010 está en marcha y ya está disponible en svn según su foro .

Abbrevia solía ser un producto comercial (para $$$), lo que significa que la documentación es bastante completa.

Otros consejos

Yo uso Zipforge. ¿Por qué hay problemas al portarlos a D2009? ¿Es por los 64 bits?

Aquí hay un código de muestra

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 puedes " hacer " COM de Delphi, entonces puede aprovechar la capacidad zip integrada del shell de Windows. Te da una buena capacidad básica.

En VBScript se ve así:

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 también le permite utilizar DotNetZip , que es una descarga gratuita, que hace cremalleras cifradas con contraseña, zip64, archivos autoextraíbles, unicode, cremalleras extendidas y otras cosas.

Personalmente uso VCL Zip que funciona con D2009 y D2010 perfectamente bien. cuesta $ 120 en el momento de esta publicación, pero es muy simple, flexible y, sobre todo, RÁPIDO.

Eche un vistazo a VCLZIP y descargue la ruta si le interesa

código sabio:

VCLZip1.ZipName := ‘myfiles.zip’;
VCLZip1.FilesList.add(‘c:\mydirectory\*.*’);
VCLZip1.Zip;

es todo lo que necesita para un zip básico, por supuesto, puede establecer niveles de compresión, estructuras de directorios, secuencias zip, descomprimir secuencias y mucho más.

Espero que esto sea de alguna ayuda.

RE

Eche un vistazo a esta unidad OpenSource SynZip . Es aún más rápido para la descompresión que la unidad predeterminada incluida con Delphi, y generará un exe más pequeño (las tablas crc se crean al inicio).

No se necesita dll externo. Funciona desde Delphi 6 hasta XE. No hay problema con la versión Unicode de Delphi. Todo en una sola unidad.

Acabo de hacer algunos cambios para manejar los nombres de archivos Unicode dentro del contenido Zip, no solo el conjunto de caracteres Win-Ansi sino cualquier carácter Unicode. Los comentarios son bienvenidos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top