2009-07-04 3 views
8

Могу ли я создать сжатую (сжатую) папку Windows XP с помощью Delphi?Создание сжатой (с застежкой) папки с использованием Delphi

+1

Что "zip property" вы имеете в виду? Можете ли вы быть более конкретным? –

+2

Быстрая перемотка вперед 2 года до 2011 года: Delphi XE2 теперь поставляется с классом TZipFile, встроенным в RTL (см. System.Zip). Может быть, кто-то, кто на самом деле использовал его, мог бы написать ответ об этом здесь. –

+1

Добавлен пример Delphi XE2. –

ответ

5

По теме в eggheadcafe, вы можете использовать CreateFile Function с FILE_FLAG_BACKUP_SEMANTICS для создания сжатой папки.

Для маршрута с расширением ракурса ознакомьтесь с Using Windows XP "Compressed Folder" shell extension to work with .zip files по Namespace Edanmo, который написан на VB.

Я только что нашел аналогичный вопрос, заданный на C++. Взгляните на Creating a ZIP file on Windows (XP/2003) in C/C++. У меня есть ощущение, что самый простой маршрут - покупка ZipForge. См. Zip a file in Delphi code sample.

1

Вы можете использовать некоторую версию командной строки любого компрессора, например 7zip, и выполнить задачу с помощью ShellExecute, или вы можете использовать бесплатный или коммерческий компонент, как любой из these.

Я использовал ZipMaster, и он очень хорошо работает для моей цели. Я не знаю, каковы ваши требования к размеру, пространству и производительности.

+0

Я в настоящее время использую его тоже, точно соответствует моим потребностям. –

4

Некоторое время назад, я попытался все библиотеки сжатия Delphi, что я мог найти, и в конце концов я закончил с использованием KaZip по Kiril Antonov.

Мои требования были:

  • Free;
  • Открытый источник;
  • Native Delphi code;
  • Внешние зависимости (dll, exe) отсутствуют. Мое самое важное требование;
  • Малый объем памяти;
  • Прост в использовании;

Я использую его в основном для превращения файлов .kml в .kmz, и он делает это удивительно быстро.

Вот пример того, как я использую его:

uses 
    KaZip; 

... 

// replaces a .kml file with a .kmz file 
procedure KmlToKmz(const aFileName: string); 
var 
    FS: TFileStream; 
    KaZip:TKaZip; 
    KmzFileName:TFileName; 
begin 
    KmzFileName := ChangeFileExt(aFileName, '.kmz'); 
    KaZip := TKaZip.Create(nil); 
    try 
    // create an empty zipfile with .kmz extension: 
    FS := TFileStream.Create(KmzFileName, fmOpenReadWrite or FmCreate); 
    try 
     KaZip.CreateZip(FS); 
    finally 
     FS.Free; 
    end;   

    KaZip.Open(KmzFileName); // Open the new .kmz zipfile 
    KaZip.Entries.AddFile(aFileName); // add the .kml 
    KaZip.Close; 
    DeleteFile(aFileName); // delete the .kml 
    finally 
    KaZip.Free; 
    end; 
end; 
+0

, к какому объекту применяется этот окончательный «Свободный»? Я думаю, что это KaZip, но у меня нет права редактировать. – Argalatyr

+0

Ах, да KaZip должен быть там освобожден .. Исправлено. Я очистил этот код в текстовом редакторе этой страницы, чтобы сделать его немного легче читать. Думаю, я должен был проверить, работает ли он еще :) –

2

A «промелькнул» папку в Windows, это не более чем файл .ZIP сжат с использованием любой стандартной библиотеки почтового индекса. Сжатые папки представляют собой другое животное и требуют формата диска NTFS.

Для файла «Zip» я настоятельно рекомендую Turbo Power Abbrevia, который является открытым исходным кодом и работает хорошо. Возможно, вы захотите проверить этот сайт alternate, если вы используете Delphi 2009, поскольку это может быть более свежая копия.

Если вы хотите использовать опцию сжатых папок, вам нужно будет изменить флаги каталога в дескрипторе каталога.Это повлияет только на файлы NEW, добавленные в этот каталог, и не будет автоматически сжимать существующие файлы. Если у вас есть существующий каталог, который вы пытаетесь сжать, переименуйте каждый существующий файл и загрузите его и сохраните обратно к исходному имени, удалив исходный файл по завершении каждого из них. У Yozey была хорошая ссылка на документацию MSDN. Просто помните, что это работает только с дисками с форматированием NTFS, поэтому вам нужно добавить чек для этого кода.

3

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

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

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

+0

Можете ли вы привести пример использования 'SynZip'? из [example] (http://synopse.info/forum/viewtopic.php?pid=163) как застегнуть папку? – PresleyDias

11

Если вы используете Delphi X2, просто использовать TZipFile из System.Zip:

застегнуть папку, используйте:

TZipFile.ZipDirectoryContents('ZipFile.zip', 'C:\Zip\this\right\now'); 

Для Zip файлов, использование:

Zip := TZipFile.Create; 
try 
    Zip.Open('ZipFile.zip', zmWrite); 

    Zip.Add('FileToBeZipped.txt'); 
    Zip.Add('ThisWillBeCompressedAgainForSureAndBecomeSmaller.zip'); 
finally 
    Zip.Free; 
end 
+0

, используя это, чтобы застегнуть папку, но продолжайте получать «Процесс не может получить доступ к файлу, потому что он используется другим процессом. Не знаете, как его можно получить? Я освободил список, который у меня был со всеми iamges в папке. я тоже писал. Любой способ увидеть, что к нему обращается, или любой способ закрыть доступ к нему ..? спасибо –

+0

@GlenMorse Через 3 года я прочитал этот anser. Первая функция, вероятно, не работает. zip, но только с первым файлом, возможно, эта функция блокирует себя. Используйте второй aproach, он отлично работает. –

+0

работает с первой версией. Вам просто нужно уйти по-своему. попробуйте что-то вроде TZipFile.ZipDirectoryContents ('.. \ ZipFile.zip', 'C: \ Zip \ this \ right \ now'); –