ZIP4j 删除指定文件和文件夹

删除
1.单独删除一个文件(不论是否有密码,都可以删):
如果删除的是一个分卷文件,那么将会报错,分卷文件不允许被更新,所以之前需要判断一下
如果要删除的文件不存在,报错:could not find file header for file
如果要删除的文件不在第一级目录,报错:could not find file header for file
要实现任意位置的文件删除,要解决并发异常和移位问题
2.删除文件夹
按照常规思路:
先判断文件夹是否存在,然后遍历出目标文件夹里面的所有文件,
先删除里面的文件,最后再删除文件夹;(这样就需要递归了)

但是这个比较特殊:
删除文件夹; zip.getFileHeaders()得到的时文件头信息,并不是真正的文件夹。
那么删除一个文件夹a/b/(比如a/b/a.txt),有2种方式:
1.先删除a/b/头信息,再删除a/b/a.txt头信息,因为文件已经删除了,所以这时文件夹也相应删除了
2.先删除a/b/a.txt头信息,再删除a/b/头信息(这样可能好理解一些),但是遍历的时候是按照第一种的顺序的;
所以就有了下面的直接遍历删除方法,最简洁;
还有一个有意思的现象,如果把压缩文件里面全部删除干净,那么就解压不出来(或者说解压出来的是空),这个如果手动压缩是实现不了的喔
代码如下:

 // 实现从zip中删除指定文件(任意位置)
    public static void deleteFile(String zipFile, String delfile)
        throws ZipException {
    ZipFile zip = new ZipFile(zipFile);
    zip.setFileNameCharset("GBK");
    checkzipFile(zip);
    // 获取文件头
    List<FileHeader> list = zip.getFileHeaders();
    String dname =null;
    boolean flag = true;
    // 如果采用forEach会出现并发异常,采用for可以解决,
    // 但是索引移位问题会遗漏head
    for (int i = 0; i < list.size(); i++) {
        dname = list.get(i).getFileName();
        // 在匹配的时候可以用正则或者endwith
        if (dname.endsWith(delfile)) {
        zip.removeFile(dname);
        // 解决索引移位问题
        --i;
        flag = false;
        System.out.println(dname + "文件删除成功!");
        }
    }
    if (flag) {
        System.out.println("没有找到你要删除的文件!");
    }
    }

    // 从zip中删除文件夹(直接遍历删除法)
    public static void deleteFolder(String zipFile, String delFolder)
        throws ZipException {
    delFolder+="/"; //比如目录:111/22,所以加了个/
    ZipFile zip = new ZipFile(zipFile);
    zip.setFileNameCharset("GBK");
    checkzipFile(zip);
    //先判断要删除的文件夹是否存在
    FileHeader dirHeader = zip.getFileHeader(delFolder); 
    if (dirHeader==null) {
        System.err.println("没有找到你要删除的文件夹!");
        return;
    }
    //存在就继续
    List<FileHeader> list = zip.getFileHeaders();
    String dname = "";
    for (int i = 0; i < list.size(); i++) {
        dname = list.get(i).getFileName();
        System.out.println(dname);
        boolean flag=dname.startsWith(delFolder);
        if (flag) {
        System.out.println("文件:"+dname+"已删除!");
        zip.removeFile(dname);
        //解决移位问题
        i--;
        }
    }
    System.out.println("删除成功!");
   }

    private static void checkzipFile(ZipFile zip) throws ZipException {
    if (!zip.isValidZipFile()) {
        throw new ZipException("此文件不存在或不合法!");
    }
    if (zip.isSplitArchive()) {
        throw new ZipException("此文件为分卷文件,不能删除!");
    }
    }

有错误的地方还请更正,谢谢
author:余绍阳,qq:279907389

你可能感兴趣的:(zip4j删除,zip4j删除文件,zip4j删除文件夹)