使用Lazarus压缩/解压zip

Lazarus默认已经提供了zip文件的压缩和解压功能,在Zipper单元中,不过,使用过程中还是有一些细节需要注意。

压缩

pascal 复制代码
uses Zipper;

{ 使用类方法进行压缩 }

//压缩单个文件
TZipper.Zip('压缩后的文件.zip', '待压缩的文件.txt');
//压缩多个文件
TZipper.Zip('压缩后的文件.zip', ['待压缩的文件1.txt', '待压缩的文件2.pdf']);

{ 使用实例对象进行压缩 }

var zip: TZipper;
zip := TZipper.Create;
try
  //压缩单个文件
  zip.ZipFile('压缩后的文件.zip', '待压缩的文件.txt');
  //压缩多个文件
  zip.ZipFiles('压缩后的文件.zip', ['待压缩的文件1.txt', '待压缩的文件2.pdf']);
finally
  zip.Free;
end; 

以上为比较方便的使用方法,但是还存在一些问题:

  1. 以上仅限于文件名为英文的情况,若文件名为中文则会出现乱码(主要是在windows平台上,用专门的压缩/解压工具打开查看列表和解压时)。查看解决方案

  2. 待压缩的文件包括路径,则压缩后的文件内也会包含传参时传入的路径。查看解决方案

另外,也可以配合FileName(压缩后的文件名)和Entries(待压缩的文件)属性使用ZipAllFiles方法;或者配合Entries(待压缩的文件)属性使用SaveToFile方法。不过,多次调用前一定要调用Clear方法,否则就会受前一次压缩操作的影响。

解压

pascal 复制代码
uses Zipper;

{ 使用类方法进行解压 }

//解压出全部文件
TUnZipper.Unzip('待解压文件.zip');
//解压出指定的多个文件
TUnZipper.Unzip('待解压文件.zip', ['指定解压出的文件1.txt', '指定解压出的文件2.pdf']);
//解压出指定的一个文件
TUnZipper.Unzip('待解压文件.zip', '指定解压出的文件.txt');

{ 使用实例对象进行解压 }

var unzip: TUnZipper;
unzip := TUnZipper.Create;
try
  //解压出全部文件
  unzip.UnZipAllFiles('待解压文件.zip');
  //解压出指定的多个文件
  unzip.UnZipFiles('待解压文件.zip', ['指定解压出的文件1.txt', '指定解压出的文件2.pdf']);
  //解压出指定的一个文件
  unzip.UnZipFile('待解压文件.zip', '指定解压出的文件.txt');
finally
  unzip.Free;
end; 

以上为比较方便的使用方法,另外,也可以配合FileName(待解压的压缩文件名)属性使用UnZipAllFilesUnZipFiles方法。

与压缩类似,同样也存在中文乱码。查看解决方案

中文乱码问题

使用类方法是无法解决中文乱码问题的。

使用实例对象,对于压缩,只需在压缩前把UseLanguageEncoding属性设置为True即可;对于解压,只需在解压前把UseUTF8属性设置为True即可。

路径问题

  • 如果压缩时传入的待压缩文件是包含绝对路径的文件名,则生成的zip文件也包含了完整的目录结构,直接解压也会按照对应的目录生成对应的文件。

  • 如果压缩时传入的待压缩文件包含部分路径,即相对路径,那么,在该相对路径下必须存在对应的待压缩文件,否则将报错;而生成的zip文件也将包含该相对路径,解压时也会按该相对路径生成对应的文件。

  • 如果压缩时传入的待压缩文件不包含任何路径,则表示相对路径为当前路径,压缩/解压规则与相对路径的规则完全一样。

注意事项

  1. 以上提及的相对路径都是对于当前路径来说的。默认情况下,当前路径是指程序所在的路径,除非程序运行时执行过ChDir,那么当前路径就是指最后一次执行过ChDir之后所在的路径。

  2. 解压时也可给OutputPath属性赋值指定路径,该路径即为解压输出时的路径,若不指定,则默认当前路径为输出路径。

  3. 当解压指定的文件时,若压缩文件中包含有路径,那么路径分隔符应使用Linux路径分隔符/,即使在Windows上也是如此。

  4. 压缩时,路径分隔符既可以使用\(仅Windows平台),也可以使用/,甚至同时使用/\也没什么问题,但非常不建议混合使用;解压时,则只能使用/

pascal 复制代码
//压缩
zip.ZipFiles('test.zip', ['a\abc.txt', '123.pdf']);
//or
zip.ZipFiles('test.zip', ['a/abc.txt', '123.pdf']); //效果完全一样

//解压 a\abc.txt
unzip.UnZipFile('test.zip', 'a/abc.txt');
相关推荐
程序无涯海2 天前
【Go入门篇】第一章:从 Java/Python 开发者的视角入门go语言
java·python·golang·教程·编程语言
MoonBit月兔9 天前
高效开发!使用Chrome对MoonBit生成的Wasm进行性能分析!
开发语言·前端·javascript·chrome·wasm·编程语言·moonbit
MoonBit月兔11 天前
双周报Vol.65:新增is表达式、字符串构造和数组模式匹配增强、IDE模式匹配补全增强...多项技术更新!
开发语言·ide·编程语言·moonbit
明月看潮生14 天前
青少年编程与数学 02-008 Pyhon语言编程基础 26课题、常见框架
python·青少年编程·框架·编程语言·编程与数学
非凡的世界16 天前
数据结构在 Web 开发中的重要性与应用
数据库·php·编程语言
明月看潮生23 天前
青少年编程与数学 02-008 Pyhon语言编程基础 02课题、基础概念
python·青少年编程·编程语言·编程与数学
明月看潮生23 天前
青少年编程与数学 02-008 Pyhon语言编程基础 01课题、语言概要
python·青少年编程·编程语言·编程与数学
栩栩云生1 个月前
[250129] Archinstall 3.0.2 发布 | Wolfram 语言与 Mathematica 14.2 版本发布
linux·编程语言·资讯
救救孩子把2 个月前
JetBrains《2024 开发者生态系统现状报告》总结
编程语言
rrokoko2 个月前
TIOBE 指数 12 月排行榜公布,VB.Net排行第九
编程语言·vb.net