Mac下DotNet解压zip文件目录结构错乱的问题

Dot Net下解压一个文件很简单:

ZipFile.ExtractToDirectory("test.zip", "./test");

但是一个程序在Mac下运行Dot Net程序去解压一个zip文件,目录结构都没有了,如下图:

image.png

研究了一下,发现原因是生成这个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);
        }
    }

你可能感兴趣的:(Mac下DotNet解压zip文件目录结构错乱的问题)