Dot Net下解压一个文件很简单:
ZipFile.ExtractToDirectory("test.zip", "./test");
但是一个程序在Mac下运行Dot Net程序去解压一个zip文件,目录结构都没有了,如下图:
研究了一下,发现原因是生成这个zip是用的Java的java.util.zip写的压缩方法生成的,压缩目录是用
File.separator
来拼接目录名,而程序又是在Windows下运行的,导致用的是\
符号到mac或linux下解压不识别这个符号,把目录标识当成文件名的一个字符。
解决的方法很简单,把File.separator
直接改成/
就可以了。顺便试了一下用Windows操作系统带的压缩工具和7zip压缩出来的zip在Mac下解压不会有这个问题。
最后附上Java修改后的压缩代码:
public ZipCompressor(File i, File o) {
source = i;
if (!source.exists()) { throw new RuntimeException(i + " : has not been found"); }
target = o;
}
public void execute() {
try {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(target));
compress(source, out, "");
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
if (file.isDirectory()) {
this.compressD(file, out, basedir);
} else {
this.compressF(file, out, basedir);
}
}
private void compressD(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists()) return;
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
compress(files[i], out, basedir + dir.getName() + "/");
}
}
private void compressF(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) { return; }
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}