любые функции для создания zip-файла каталога / file в vista с delphi 2009

StackOverflow https://stackoverflow.com/questions/1634258

Вопрос

Я ищу простой метод архивирования и сжатия с помощью delphi.Я уже ознакомился с компонентами в torry delphi:http://www.torry.net/pages.php?s=99.Все они выглядят так, как будто они выполнят то, что я хочу, однако несколько недостатков в их использовании заключаются в том, что ни один из них не запускается в delphi 2009 и являются очень сложными, что затрудняет их перенос в delphi 2009.И, кроме того, документация по ним скудна, по крайней мере, для меня.Мне нужна базовая функциональность архивирования без накладных расходов, связанных с использованием кучи библиотек DLL.Мои поиски привели меня к FSCTL_SET_COMPRESSION, которое, как я думал, решило бы проблему, но, к сожалению, это тоже не сработало.CREATEFILE выглядел многообещающе, пока я не попробовал, он дал тот же результат, что и FSCTL_SET...Я знаю, что в Windows существуют некоторые ограниченные возможности встроенной архивации.Например, если щелкнуть правой кнопкой мыши файл или папку и выбрать -> Отправить -> архивированная папка, то будет быстро создан архивированный архив.Я думаю, что если бы я смог получить доступ к этой возможности из delphi, это было бы решением.Что касается побочного вопроса, есть ли в linux свои собственные функции архивирования, которые можно использовать аналогично этому?

Это было полезно?

Решение

Отличную аббревиатуру TurboPower можно загрузить для D2009 здесь , поддержка D2010 уже ведется и уже доступна в svn в соответствии с их форумом .

Аббревиатура раньше была коммерческим (для $$$) продуктом, что означает, что документация довольно полная.

Другие советы

Я использую Zipforge. Почему возникают проблемы с портированием их на D2009? Это из-за 64-битного ??

Вот пример кода

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;

Если вы можете " сделать " COM от Delphi, тогда вы можете воспользоваться встроенной функцией zip оболочки Windows. Это дает вам хорошие базовые возможности.

В VBScript это выглядит так:

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 также позволяет использовать DotNetZip , бесплатную загрузку, которая выполняет зашифрованные паролем архивы, zip64, самораспаковывающиеся архивы, юникод, составные почтовые индексы и другие вещи.

Лично я использую VCL Zip, который отлично работает с D2009 и D2010.на момент написания этого поста это действительно стоило 120 долларов, но является очень простым, гибким и, самое главное, БЫСТРЫМ.

Взгляните на VCLZIP и скачайте трейл, если вам интересно

с точки зрения кода:

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

это все, что вам нужно для базового zip-файла, вы, конечно, можете устанавливать уровни сжатия, структуры каталогов, zip-потоки, распаковывать zip-потоки и многое другое.

Надеюсь, это окажет вам некоторую помощь.

РЕ

Посмотрите на этот модуль OpenSource SynZip . Это даже быстрее для распаковки, чем модуль по умолчанию, поставляемый с Delphi, и он создаст меньший exe (таблицы crc создаются при запуске).

Внешние DLL не нужны. Работает от Delphi 6 до XE. Нет проблем с Unicode-версией Delphi. Все в одном блоке.

Я только что внес некоторые изменения для обработки имен файлов Unicode внутри содержимого Zip, не только для кодировки Win-Ansi, но и для любых символов Unicode. Обратная связь приветствуется.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top