带有文件和子目录的zip目录,没有Java中的绝对路径

时间:2012-01-30 13:32:13

标签: java directory zip

我有一个Java程序,用于压缩目录的所有文件和子目录。它创建一个带有绝对路径的zip文件,例如c:\ dir1 \ dirzip \,但我希望它创建的文件只包含de文件和子目录,而不是绝对路径。 CA anaybode帮助我,拜托? 这是我的代码:

import java.io.*;
import java.util.zip.*;

public class zip {

    public static void main(String argv[]) {
        try {

            ZipOutputStream zos =
                new ZipOutputStream(new FileOutputStream(
                    "c:\\pruebazip\\dancedragons.zip"));

            zipDir("c:\\pruebazip\\dancedragons\\", zos);

            zos.close();
        }
        catch (Exception e) {

        }
    }

    public static void zipDir(String dir2zip, ZipOutputStream zos) {
        try {

            File zipDir = new File(dir2zip);
            // lista del contenido del directorio
            String[] dirList = zipDir.list();
            // System.out.println(dirList[1]);
            byte[] readBuffer = new byte[2156];
            int bytesIn = 0;

            System.out.println(dirList.length);
            // recorro el directorio y añado los archivos al zip
            for (int i = 0; i < dirList.length; i++) {
                File f = new File(zipDir, dirList[i]);
                if (f.isDirectory()) {

                    String filePath = f.getPath();
                    zipDir(filePath, zos);

                    System.out.println(filePath);
                    continue;
                }

                FileInputStream fis = new FileInputStream(f);

                ZipEntry anEntry = new ZipEntry(f.getPath());

                zos.putNextEntry(anEntry);

                while ((bytesIn = fis.read(readBuffer)) != -1) {
                    zos.write(readBuffer, 0, bytesIn);
                }

                fis.close();
            }
        }
        catch (Exception e) {
            // handle exception
        }

    }

}

2 个答案:

答案 0 :(得分:6)

如果您希望将每个zip条目存储在相对于压缩文件夹的目录结构中,那么不要使用文件完整路径构建ZipEntry:

new ZipEntry(f.getPath());

使用相对于压缩目录的路径构造它:

String relativePath = zipDir.toURI().relativize(f.toURI()).getPath();
new ZipEntry(relativePath);

答案 1 :(得分:1)

您的问题可能是声明

new ZipEntry(f.getPath())

仔细检查f.getPath()不是像C:\dir\...那样的绝对路径。

您可能需要new ZipEntry(dirList[i])之类的内容。