2

我正在寻找一种使用 delphi 进行压缩和压缩的简单方法。我已经查看了 torry delphi 的组件:http ://www.torry.net/pages.php?s=99. 它们似乎都可以完成我想要的,但是使用它们的一些缺点是它们都没有在 delphi 2009 中运行并且非常复杂,这使得我很难将它们移植到 delphi 2009。此外,关于它们是稀缺的,至少对我来说是这样。我需要基本的压缩功能,而不需要使用一堆 DLL 的开销。我的任务将我引向 FSCTL_SET_COMPRESSION,我认为它可以解决问题,但不幸的是这也不起作用。CREATEFILE 看起来很有希望,直到我尝试它产生与 FSCTL_SET 相同的结果...我知道 Windows 上有一些有限的本机压缩功能。例如,如果右键单击文件或文件夹并选择 -> sendTo ->zipped 文件夹,则会巧妙地创建一个压缩存档。我认为如果我能够从 delphi 访问该功能,那将是一个解决方案。在一个侧面问题上,linux 是否有自己的本机压缩功能,可以类似地使用?

4

5 回答 5

4

TurboPower 优秀的 Abbrevia 可以在这里下载 D2009 ,D2010 支持正在进行中,并且根据他们的论坛已经在 svn 中可用。

Abbrevia 曾经是商业(用于 $$$)产品,这意味着文档非常完整。

于 2009-10-27T23:38:23.280 回答
0

我使用 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;
于 2009-10-28T00:06:51.873 回答
0

如果您可以从 Delphi“做”COM,那么您可以利用 Windows shell 的内置 zip 功能。它为您提供了良好的基本能力。

在 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、自解压档案、unicode、跨区 zip 和其他事情。

于 2009-10-28T00:16:02.670 回答
0

我个人使用与 D2009 和 D2010 完美结合的 VCL Zip。在发布这篇文章时它确实花费了 120 美元,但它非常简单、灵活,而且最重要的是 FAST。

如果您有兴趣,请查看VCLZIP并下载路径

代码明智:

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

是基本 zip 所需的全部内容,您当然可以设置压缩级别、目录结构、zip 流、解压缩流等等。

希望这会有所帮助。

关于

于 2009-10-29T18:04:06.013 回答
0

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

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

我刚刚做了一些更改来处理 Zip 内容中的 Unicode 文件名,不仅是 Win-Ansi 字符集,还有任何 Unicode 字符。欢迎反馈。

于 2011-05-18T06:09:00.833 回答