Любые функции для создания ZIP-файла каталога / файла на Vista с Delphi 2009 - PullRequest
2 голосов
/ 28 октября 2009

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

Ответы [ 5 ]

4 голосов
/ 28 октября 2009

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

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

0 голосов
/ 18 мая 2011

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

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

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

0 голосов
/ 29 октября 2009

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

Взгляните на VCLZIP и загрузите след, если вы заинтересованы

код мудрый:

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

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

Надеюсь, это поможет.

RE

0 голосов
/ 28 октября 2009

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

0 голосов
/ 28 октября 2009

Я использую 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;
...