Pergunta

Eu estou procurando um método simples de compactação e comprimindo com delphi. Já olhou para os componentes em torry delphi: http://www.torry.net /pages.php?s=99 . Eles todos parecem como se iria conseguir o que eu quero no entanto algumas desvantagens para usá-los é que nenhum deles executado em delphi 2009 e são muito complexas que torna difícil para mim porta-los para o Delphi 2009. E, além disso, a documentação sobre eles é escasso, bem, pelo menos para mim. Preciso funcionalidade básica de compactação sem a sobrecarga de usar um grupo de DLLs. A minha busca me levou a FSCTL_SET_COMPRESSION que eu pensei que teria resolvido o problema, mas infelizmente isso também não funcionou. CreateFile parecia promissor, até que eu tentei rendeu o mesmo resultado que FSCTL_SET ... Eu sei que há alguma capacidade de compactação nativa limitada em janelas. Por exemplo, se um direito clica em um arquivo ou pasta e seleciona -> sendTo -> pasta zipada, um arquivo zipado é inteligentemente criado. Eu acho que se eu era capaz de acesso que a capacidade de delphi será uma solução. Por uma questão de lado, o Linux tem suas próprias funções fechando nativas que podem ser usados ??semelhante a isto?

Foi útil?

Solução

excelente Abbrevia de TurboPower pode ser baixado D2009 aqui , suporte D2010 está em andamento e já está disponível svn de acordo com sua fórum.

Abbrevia costumava ser um produto comercial (para $$$), o que significa que a documentação é bastante completo.

Outras dicas

Eu uso ZipForge. Por que existem problemas portar estes a D2009? É por causa da 64bit ??

Aqui está um código de exemplo

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 você pode "fazer" COM da Delphi, em seguida, você pode aproveitar o recurso interno de zip do shell do Windows. Dá-lhe boa capacidade básica.

Em VBScript, parece que isso:

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 também allws você use DotNetZip , que é um download gratuito, que faz zips criptografados por senha, zip64, auto-extraível arquivos, unicode, fechos estendidos, e outras coisas.

Pessoalmente eu uso VCL Zip que corre com D2009 e D2010 perfeitamente bem. que não custa US $ 120 no momento deste post, mas é muito simples, flexível e, acima de tudo rápido.

Tenha um olhar em VCLZIP e descarregue a trilha se estiver interessado

código sábio:

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

é tudo que você precisa para um zip básicos, você pode de definir níveis curso de compressão, estruturas de diretórios, ZIP córregos, riachos descompactar e muito mais.

Espero que este seja de alguma ajuda.

RE

Dê uma olhada neste OpenSource SynZip unidade . É ainda mais rápido para a descompressão do que a unidade padrão fornecido com Delphi, e vai gerar um exe menor (mesas de CRC são criados na inicialização).

Não é necessário dll externo. Obras de Delphi 6 até XE. Nenhum problema com a versão Unicode de Delphi. Tudo em uma única unidade.

Eu só fiz algumas mudanças para lidar com nomes de arquivo Unicode dentro Zip conteúdo, não só charset Win-Ansi, mas quaisquer caracteres Unicode. O feedback é bem-vindo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top