添加额外文件夹的Java zip util

添加额外文件夹的Java zip util,java,zip,Java,Zip,我在压缩文件夹时遇到问题 我会有一个这样的文件夹 C:\Lazy\Test 包含文件File1.cpp、File2.hpp,。。等 压缩后的文件夹看起来像C:\Lazy\Test.zip->Lazy\Test,其中包含所有cpp和hpp文件 我想删除创建的额外子文件夹(Lazy\Test)。为什么会这样 换句话说,压缩后的文件并不在压缩文件的正下方,我必须再导航两个文件夹才能找到它们 我在代码中的何处可以找到此问题 private void zipDirectory() {

我在压缩文件夹时遇到问题

我会有一个这样的文件夹

C:\Lazy\Test
包含文件File1.cpp、File2.hpp,。。等

压缩后的文件夹看起来像C:\Lazy\Test.zip->Lazy\Test,其中包含所有cpp和hpp文件

我想删除创建的额外子文件夹(Lazy\Test)。为什么会这样

换句话说,压缩后的文件并不在压缩文件的正下方,我必须再导航两个文件夹才能找到它们

我在代码中的何处可以找到此问题

    private void zipDirectory() {

       File lazyDirectory = new File(defaultSaveLocation);

       File[] files = lazyDirectory.listFiles();

       for (File file : files) {

          if (file.isDirectory()) {
            System.out.println("Zipping up " + file);
            zipContents(file);
            }
        }       
    }


public static void addToZip(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException {

    System.out.println("Writing '" + fileName + "' to zip file");

    File file = new File(fileName);
    FileInputStream fis = new FileInputStream(file);
    ZipEntry zipEntry = new ZipEntry(fileName);
    zos.putNextEntry(zipEntry);

    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zos.write(bytes, 0, length);
    }

    zos.closeEntry();
    fis.close();

    }

public static void zipContents(File dirToZip) {

    List<File> fileList = new ArrayList<File>();

    File[] filesToZip = dirToZip.listFiles();

    for (File zipThis : filesToZip) {

        String ext = "";

        int i = zipThis.toString().lastIndexOf('.');

        if (i > 0) {
            ext = zipThis.toString().substring(i+1);
        }

        if(ext.matches("cpp|bem|gz|h|hpp|pl|pln|ppcout|vec|xml|csv")){
            fileList.add(zipThis);
        }

    }


    try {
        FileOutputStream fos = new FileOutputStream(dirToZip.getName() + ".zip");
        ZipOutputStream zos = new ZipOutputStream(fos);

        for (File file : fileList) {

            addToZip(file.toString(), zos);

        }

      } catch (FileNotFoundException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
    }
private void zipDirectory(){
File lazyDirectory=新文件(defaultSaveLocation);
File[]files=lazyDirectory.listFiles();
用于(文件:文件){
if(file.isDirectory()){
System.out.println(“压缩”+文件);
ZipContent(文件);
}
}       
}
公共静态void addToZip(字符串文件名,zipoutpstream zos)抛出FileNotFoundException,IOException{
System.out.println(“将“'+fileName+“'写入zip文件”);
文件=新文件(文件名);
FileInputStream fis=新的FileInputStream(文件);
ZipEntry ZipEntry=新ZipEntry(文件名);
佐斯·普特内森特里(齐彭特里);
字节[]字节=新字节[1024];
整数长度;
而((长度=fis.read(字节))>=0){
写入(字节,0,长度);
}
zos.closeEntry();
fis.close();
}
公共静态void zipContents(文件dirToZip){
List fileList=new ArrayList();
文件[]filesToZip=dirToZip.listFiles();
for(文件zipThis:filesToZip){
字符串ext=“”;
int i=zipThis.toString().lastIndexOf('.');
如果(i>0){
ext=zipThis.toString()子字符串(i+1);
}
如果(外部匹配(“cpp | bem | gz | h | hpp | pl | pln | ppcout | vec | xml | csv”)){
fileList.add(zipThis);
}
}
试一试{
FileOutputStream fos=新的FileOutputStream(dirToZip.getName()+“.zip”);
ZipoutStream zos=新ZipoutStream(fos);
用于(文件:文件列表){
addToZip(file.toString(),zos);
}
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}

addToZip
文件更改为获取
文件
对象。使用它打开文件流,但仅使用
文件#getName
创建
ZipEntry
,如下所示

public static void addToZip(File file, ZipOutputStream zos) throws FileNotFoundException, IOException {

    System.out.println("Writing '" + fileName + "' to zip file");

    FileInputStream fis = new FileInputStream(file);
    ZipEntry zipEntry = new ZipEntry(file.getName());
    zos.putNextEntry(zipEntry);

    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zos.write(bytes, 0, length);
    }

    zos.closeEntry();
    fis.close();

}

addToZip
文件更改为获取
file
对象。使用它打开文件流,但仅使用
file#getName
创建
ZipEntry
,如下所示

public static void addToZip(File file, ZipOutputStream zos) throws FileNotFoundException, IOException {

    System.out.println("Writing '" + fileName + "' to zip file");

    FileInputStream fis = new FileInputStream(file);
    ZipEntry zipEntry = new ZipEntry(file.getName());
    zos.putNextEntry(zipEntry);

    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zos.write(bytes, 0, length);
    }

    zos.closeEntry();
    fis.close();

}

你的意思是,你只想在zip文件中以单一的平面目录结构将文件或子文件夹中的文件添加到zip中吗?因此
C:\Lazy\Test\Super.cpp
成为zip文件中的
Super.cpp
?是的,这正是我的意思。你的意思是,你只想在si中将文件或子文件夹中的文件添加到zip中吗zip文件中的ngle,平面目录结构?因此
C:\Lazy\Test\Super.cpp
在zip文件中变成
Super.cpp
?是的,这正是我的意思我已经尝试过的。我得到了java.io.FileNotFoundException,因为我与要压缩的文件不在同一个目录中,而且程序不知道在哪里查找文件正在压缩的文件。更新了答案,应该看到commingI更改了ZipEntry ZipEntry=new ZipEntry(file.getName())…更容易修复。无论如何感谢您的帮助。除了您两次创建
文件
对象之外,这是您的API,您可能有您的原因。此外,您可能还想检查文件是否存在,以防万一;)我已经尝试过了。我得到了java.io.FileNotFoundException,因为我与要压缩和删除的文件不在同一目录中程序不知道在哪里查找正在压缩的文件。更新了答案后,应该看到commingI更改了ZipEntry ZipEntry=new ZipEntry(file.getName())…更容易修复。无论如何感谢您的帮助(除了您两次创建
文件
对象之外,但这是您的API,您可能有自己的原因。此外,您可能还需要检查文件是否存在,以防万一;)