使用Delphi创建压缩(Zipped)文件夹

时间:2009-07-04 18:23:59

标签: delphi winapi zip winzip compressed-folder

我可以使用Delphi创建Windows XP的压缩(Zipped)文件夹吗?

9 个答案:

答案 0 :(得分:15)

如果您使用的是Delphi X2,只需使用System.Zip中的TZipFile:

要压缩文件夹,请使用:

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

答案 1 :(得分:5)

根据eggheadcafe中的帖子,您可以使用CreateFile FunctionFILE_FLAG_BACKUP_SEMANTICS来创建压缩文件夹。

对于shell扩展路由,请查看Namespace Edanmo的Using Windows XP "Compressed Folder" shell extension to work with .zip files,它是用VB编写的。

我刚刚在C ++上发现了类似的问题。看看Creating a ZIP file on Windows (XP/2003) in C/C++。我有一种感觉,最简单的方法是购买ZipForge。请参阅Zip a file in Delphi code sample

答案 2 :(得分:4)

前段时间,我已经尝试了所有可以找到的Delphi压缩库,最终我最终使用了KaZip Kiril Antonov

我的要求是:

  • 免;
  • 开源;
  • 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;

答案 3 :(得分:4)

看看这个OpenSource SynZip unit。解压缩比Delphi附带的默认单元更快,它会生成一个更小的exe(crc表在启动时创建)。

不需要外部dll。适用于Delphi 6至XE。 Unicode版本的Delphi没问题。全部在一个单元中。

我刚刚对Zip内容中的Unicode文件名进行了一些更改,不仅包括Win-Ansi字符集,还包括任何Unicode字符。欢迎提供反馈。

答案 4 :(得分:3)

您可以使用现在是开源的TurboPower Abbrevia

答案 5 :(得分:2)

Windows中的“zipped”文件夹只不过是使用任何标准zip库压缩的.ZIP文件。压缩文件夹是一种不同的动物,需要NTFS磁盘格式。

对于“Zip”文件,我强烈建议Turbo Power Abbrevia,它是开源的,效果很好。如果您使用Delphi 2009,可能需要检查此alternate网站,因为它可能是更新的副本。

如果您想使用压缩文件夹选项,则需要修改目录句柄上的目录标志。这只会影响添加到该目录的新文件,并且不会自动压缩现有文件。如果您正在尝试压缩现有目录,则重命名每个现有文件,然后将其加载并保存回原始名称,并在完成每个文件时删除原始文件。 Yozey与MSDN文档有很好的联系。请记住,这仅适用于NTFS格式的磁盘,因此您需要在代码中添加一个检查。

答案 6 :(得分:1)

您可以使用7zip之类的任何压缩器的某些命令行版本,并使用ShellExecute执行任务,或者您可以像these中的任何人一样使用免费或商业组件。

我曾使用过ZipMaster,但它的表现非常好。我不知道你的尺寸,空间和性能要求是什么。

答案 7 :(得分:1)

答案 8 :(得分:0)

TZipFile.ZipDirectoryContents方法对我不起作用,因此我使用TZipFile.add()创建了自己的实现。如果有人需要,我会在这里发布。

procedure CreateZipOfDirectory(directory: string);
var
  zip: TZipFile;
  Arr: tarray<string>;
  str: string;
  
  function GetAllFilesInDir(const Dir: string): tarray<string>;
  var
    Search: TSearchRec;
    procedure addAll(arr: tarray<string>; parent: string);
    var
      tmp: string;
    begin
      for tmp in arr do
      begin
        setlength(result, length(result) + 1);
        result[length(result) - 1] := IncludeTrailingBackslash(parent) + tmp;
      end;
    end;
  begin
    setlength(result, 0);
    if FindFirst(IncludeTrailingBackslash(Dir) + '*.*', faAnyFile or faDirectory, Search) = 0 then
      try
        repeat
          if (Search.Attr and faDirectory) = 0 then
          begin
            setlength(result, length(result) + 1);
            result[length(result) - 1] := Search.Name;
          end
          else if (Search.Name <> '..') and (Search.Name <> '.') then
            addAll(GetAllFilesInDir(IncludeTrailingBackslash(Dir) + Search.Name), Search.Name);
        until FindNext(Search) <> 0;
      finally
        FindClose(Search);
      end;
  end;

begin
  Zip := TZipFile.Create;
  try
    Zip.Open('Foo.zip', zmWrite);
    arr := GetAllFilesInDir(directory); // The Delphi TZipFile.ZipDirectoryContents does not work properly, so let's create our own.
    for str in arr do
      zip.Add(directory + str, str); // Add the second parameter to make sure that the file structure is preserved.
  finally
    zip.Free;
  end;
end;