我可以使用Delphi创建Windows XP的压缩(Zipped)文件夹吗?
答案 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 Function和FILE_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。
我的要求是:
我主要用它来将.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;