早上看到一篇关于压缩文件的处理文章,测试之后发现解压缩unzip没有问题,但是对于压缩文件,不支持嵌套,对于空文件夹压缩也会出现错误。
修改了一下,作为加强版,记录如下:
第一步:工具类,组织需要压缩的文件夹下的目录以及文件。
@SuppressWarnings("unchecked")
final static public Vector parse(File[] files, Vector v) {
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
v.add(files[i]);
} else {
if (null != files[i].list() && files[i].list().length == 0) {
v.add(files[i]);
} else {
parse(files[i].listFiles(), v);
}
}
}
return v;
}
第二步:处理解析出来的文件路径,变化为相对路径。
final static public String path(String base, String total) {
return total.substring(base.length() - 3, total.length());
}
第三步:压缩处理,注意压缩文件与压缩文件夹的区别。
@SuppressWarnings("unchecked")
final static public void zip(String srcfile, String destfile) {
try {
BufferedInputStream origin = null;
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
new FileOutputStream(destfile)));
byte data[] = new byte[BUFFER];
File f = new File(srcfile);
Vector v = new Vector();
v = parse(f.listFiles(), v);
File file = null;
String path = null;
for (int i = 0; i < v.size(); i++) {
file = (File) v.elementAt(i);
path = path(srcfile, file.getAbsolutePath());
if (file.isFile()) {
origin = new BufferedInputStream(new FileInputStream(file),
BUFFER);
ZipEntry entry = new ZipEntry(path);
out.putNextEntry(entry);
int count;
while ((count = origin.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
} else {
ZipEntry entry = new ZipEntry(path + "/");
out.putNextEntry(entry);
}
}
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
OK,测试代码
@SuppressWarnings("unchecked")
public static void main(String[] args) {
zip("D://zipunzip//testzip//", "D://zipunzip//dest.zip");
unzip("D://zipunzip//dest.zip", "D://zipunzip//testunzip//");
}
另外:附加原始的解压缩代码:
@SuppressWarnings("unchecked")
final static public void unzip(String srcfile, String destfile) {
try {
ZipFile zipFile = new ZipFile(srcfile);
Enumeration emu = zipFile.entries();
while (emu.hasMoreElements()) {
ZipEntry entry = (ZipEntry) emu.nextElement();
if (entry.isDirectory()) {
new File(destfile + entry.getName()).mkdirs();
continue;
}
BufferedInputStream bis = new BufferedInputStream(zipFile
.getInputStream(entry));
File file = new File(destfile + entry.getName());
File parent = file.getParentFile();
if (parent != null && (!parent.exists())) {
parent.mkdirs();
}
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
}
bos.flush();
fos.close();
bos.close();
bis.close();
}
zipFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
现在想研究一下直接使用字节流来解析压缩文件,看看相关压缩文件的格式,应该不成问题。
接下来写好了发布。
分享到:
相关推荐
在某些情况下,我们可能需要处理ZIP文件,但默认的Linux发行版可能并未预装ZIP和UNZIP工具。这时,我们可以使用RPM命令来解决这个问题,即使系统无法联网。 标题“rpm zip和unzip.zip”暗示了我们将讨论如何通过RPM...
在Windows操作系统中,通常我们使用图形化界面来处理压缩文件,如WinRAR或7-Zip。但有时,为了自动化脚本或与Linux环境保持一致性,我们需要在命令行中使用`zip`和`unzip`命令。这篇内容将详细介绍如何在Windows上...
在Qt框架中,实现文件和文件夹的压缩与解压缩功能主要依赖于QIODevice、QFile、QByteArray、QDataStream等类,以及第三方库如QZipWriter和QZipReader。Qt本身并不直接支持ZIP文件的操作,但通过这些类和第三方库,...
本主题主要关注两个工具:`zip` 和 `unzip`,它们主要用于处理ZIP格式的压缩文件。ZIP是一种广泛使用的文件归档格式,允许用户将多个文件和目录打包成一个单一的可压缩文件。 `zip` 是一个用于创建ZIP归档的命令行...
本资源“zipunzip.zip”提供了一个专门处理ZIP文件格式的第三方代码库,它支持对文件进行压缩和解压缩。以下是这个库的相关知识点详解: 1. ZIP文件格式:ZIP是一种广泛使用的文件归档格式,它可以将多个文件和目录...
总的来说,这个Zip和Unzip源码提供了便捷的C++接口,使得开发者能够轻松集成Zip文件处理功能到他们的项目中,无论是在老版本的VC6还是更新的VS2008环境下,都能保证代码的稳定运行。对于需要在Windows平台上进行文件...
`ZipHelper`可能是一个类,包含了创建ZIP文件,添加文件到ZIP,以及处理Unicode路径等方法。`ZipHelper.cpp`是其实现,而`ZipHelper.h`则定义了类接口和必要的函数原型。 在VS2015中,开发者可以利用Visual C++的...
总的来说,“cpp-基于C语言跨平台zip/unzip”项目涉及到C语言编程、跨平台开发、文件压缩与解压缩技术、库的使用(如libzip)、错误处理、内存管理和构建工具的运用等多个知识点。开发者需要具备扎实的C语言基础,...
标题 "ZIP 解压 unzip 静态库" 涉及到的是在计算机编程中处理ZIP文件的方法,特别是关于如何创建和使用ZIP静态库来实现文件的解压缩功能。ZIP是一种广泛使用的文件压缩格式,它允许将多个文件打包成一个单一的可执行...
本篇将详细讲解`clear`、`wget`、`zip`和`unzip`这四个在安卓厨房(通常指的是用于安卓应用修改和打包的环境)中常用的命令行工具,以及它们在cygwin环境中的应用。 1. `clear`命令:这是一个非常基础的命令,用于...
标题中的"zip.exe,unzip.exe压缩解压工具"指的是两个在Windows环境下用于处理压缩文件的命令行工具。zip.exe用于文件和文件夹的压缩,而unzip.exe则用于解压缩已有的.zip文件。这两个工具提供了对ZIP格式的便捷支持...
### Java Zip 和 Unzip 技术详解 #### 一、Java Zip 技术概述 在 Java 开发过程中,经常会遇到需要对文件进行压缩处理的情况,比如在网络传输中减少数据量,或者是在存储时节省空间等场景。Java 提供了内置的支持...
记住,尽管这里介绍的是`zip`和`unzip`,在Linux中还有其他压缩格式(如tar、gzip、bzip2等)以及对应的命令行工具,如`tar`、`gzip`和`bzip2`,了解并熟练使用它们将有助于提升你在Linux环境下的工作效率。
`zip`和`unzip`命令用于处理.zip格式的压缩文件,而`rpm`则是Linux下用来安装、升级、查询和卸载软件包的标准工具,尤其在Red Hat Enterprise Linux (RHEL)及其衍生系统如CentOS中广泛使用。下面我们将详细探讨这些...
本主题将深入探讨标题和描述中提到的一些常见DOS工具,包括`zip`、`unzip`以及相关的文件处理命令。 1. **`zip`**:`zip`是一个用于文件压缩的命令行工具,它源自Unix系统,但在DOS环境下也有应用。`zip`命令可以将...
Java的zip和unzip操作是程序开发中常见的文件处理任务,尤其在数据传输、备份或者归档场景下显得尤为重要。本教程将详细讲解如何在Java中...此外,文件权限、异常处理以及多线程优化也是实际应用中需要考虑的重要因素。
本项目关注的是使用C语言实现的跨平台ZIP和UNZIP功能,这对于那些需要处理压缩文件的系统级或者底层应用开发者来说非常有价值。C语言作为一种基础且广泛使用的编程语言,其简洁、高效和移植性好等特点使得它成为实现...
在Windows操作系统中,通常我们使用的文件打包和压缩工具与Linux环境下的`zip`和`unzip`命令有所不同。然而,为了在Windows上实现与Linux类似的压缩和解压功能,我们可以利用专门为Windows设计的软件,如`WinZip`或`...
这涉及到创建一个`AirXZip`实例,然后调用`zip`方法,提供一个包含待压缩文件或目录的数组,以及目标ZIP文件的URL。例如: ```actionscript import com.coltware.airxzip.AirXZip; var sourceFiles:Array = [File....
在源代码中,开发者可能会找到关于如何处理ZIP文件的细节,包括如何解析文件头,识别不同的压缩方法(如Deflate、BZip2等),以及如何正确地提取和解压数据。此外,源码中还可能包含了错误处理和日志记录的机制,这...