我正在寻找一种使用 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 是否有自己的本机压缩功能,可以类似地使用?
5 回答
我使用 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;
如果您可以从 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 和其他事情。
我个人使用与 D2009 和 D2010 完美结合的 VCL Zip。在发布这篇文章时它确实花费了 120 美元,但它非常简单、灵活,而且最重要的是 FAST。
如果您有兴趣,请查看VCLZIP并下载路径
代码明智:
VCLZip1.ZipName := ‘myfiles.zip’;
VCLZip1.FilesList.add(‘c:\mydirectory\*.*’);
VCLZip1.Zip;
是基本 zip 所需的全部内容,您当然可以设置压缩级别、目录结构、zip 流、解压缩流等等。
希望这会有所帮助。
关于
看看这个OpenSource SynZip 单元。它的解压速度甚至比 Delphi 附带的默认单元更快,并且它会生成更小的 exe(crc 表在启动时创建)。
不需要外部 dll。适用于从 Delphi 6 到 XE。Delphi 的 Unicode 版本没有问题。全部在一个单元中。
我刚刚做了一些更改来处理 Zip 内容中的 Unicode 文件名,不仅是 Win-Ansi 字符集,还有任何 Unicode 字符。欢迎反馈。