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;
以上为比较方便的使用方法,但是还存在一些问题:
-
以上仅限于
文件名为英文
的情况,若文件名为中文
则会出现乱码(主要是在windows
平台上,用专门的压缩/解压工具打开查看列表和解压时)。查看解决方案。 -
若
待压缩的文件
包括路径,则压缩后的文件
内也会包含传参时传入的路径。查看解决方案。
另外,也可以配合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
(待解压的压缩文件名)属性使用UnZipAllFiles
或UnZipFiles
方法。
与压缩类似,同样也存在中文乱码
。查看解决方案。
中文乱码问题
使用类方法
是无法解决中文乱码
问题的。
使用实例对象
,对于压缩,只需在压缩前把UseLanguageEncoding
属性设置为True
即可;对于解压,只需在解压前把UseUTF8
属性设置为True
即可。
路径问题
-
如果压缩时传入的
待压缩文件
是包含绝对路径的文件名,则生成的zip
文件也包含了完整的目录结构,直接解压也会按照对应的目录生成对应的文件。 -
如果压缩时传入的
待压缩文件
包含部分路径,即相对路径,那么,在该相对路径下必须存在对应的待压缩文件
,否则将报错;而生成的zip
文件也将包含该相对路径,解压时也会按该相对路径生成对应的文件。 -
如果压缩时传入的
待压缩文件
不包含任何路径,则表示相对路径为当前路径
,压缩/解压规则与相对路径
的规则完全一样。
注意事项
-
以上提及的相对路径都是对于
当前路径
来说的。默认情况下,当前路径
是指程序所在的路径,除非程序运行时执行过ChDir
,那么当前路径
就是指最后一次执行过ChDir
之后所在的路径。 -
解压时也可给
OutputPath
属性赋值指定路径,该路径即为解压输出时的路径,若不指定,则默认当前路径
为输出路径。 -
当解压指定的文件时,若压缩文件中包含有路径,那么路径分隔符应使用
Linux路径分隔符
即/
,即使在Windows
上也是如此。 -
压缩时,路径分隔符既可以使用
\
(仅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');