Java Zip4j从Zip中排除文件夹

Java Zip4j从Zip中排除文件夹,java,zip,directory,ziparchive,zip4j,Java,Zip,Directory,Ziparchive,Zip4j,我有一个目录,其中有一些文件夹应该跳过,而不是添加到目标ZIP文件中。我在Windows上将它们标记为隐藏,我可以使用Java代码查询此属性,如下所示: new File("C:\\myHiddenFolder").isHidden(); 但是,我不知道如何将其与以下基于方法结合使用,以跳过添加这些相应的目录: public File createZipArchive(String sourceFilePath) throws ZipException, IOException { Z

我有一个目录,其中有一些文件夹应该跳过,而不是添加到目标
ZIP
文件中。我在
Windows
上将它们标记为隐藏,我可以使用Java代码查询此属性,如下所示:

new File("C:\\myHiddenFolder").isHidden();
但是,我不知道如何将其与以下基于方法结合使用,以跳过添加这些相应的目录:

public File createZipArchive(String sourceFilePath) throws ZipException, IOException
{
    ZipParameters zipParameters = new ZipParameters();
    zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
    zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_ULTRA);
    zipParameters.setEncryptFiles(true);
    zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
    zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
    zipParameters.setPassword("MyPassword");

    String baseFileName = FileNameUtilities.getBaseFileName(sourceFilePath);
    String destinationZipFilePath = baseFileName + "." + EXTENSION;

    ZipFile zipFile = new ZipFile(destinationZipFilePath);
    File sourceFile = new File(sourceFilePath);

    // Recursively add directories
    if (sourceFile.isDirectory())
    {
        File[] childrenFiles = sourceFile.listFiles();

        if (childrenFiles != null)
        {
            for (File folder : childrenFiles)
            {
                if (folder.isHidden()) // Nope, no recursive checking!
                {
                    // This is the problem, it adds the parent folder and all child folders without allowing me to check whether to exclude any of them...
                    zipFile.addFolder(folder.getAbsolutePath(), zipParameters);
                }
            }
        }
    } else
    {
        // Add just the file
        zipFile.addFile(new File(sourceFilePath), zipParameters);
    }

    return zipFile.getFile();
}

请注意,此方法仅在(隐藏)文件夹位于最高层时有效,但应适用于任何深度。

您可以添加
zippParameters.setReadHiddenFiles(false)
,zip4j不会将隐藏文件夹和文件添加到
ZipFile

为了解决这个问题,我将所有隐藏文件夹移出,打包zip文件并将文件夹移回:

HiddenDirectoriesMover hiddenDirectoriesMover = new HiddenDirectoriesMover(sourceFilePath);
        hiddenDirectoriesMover.removeFiles();

// Create zip

hiddenDirectoriesMover.returnFiles();
一个肮脏的工作,但做的工作,因为
zippParameters.setReadHiddenFiles(假)

publicstaticarraylistgetfileindirectoryrec(文件路径,
布尔readHiddenFiles)引发ZipException{
if(路径==null){
抛出新ZipException(“输入路径为空,无法读取目录中的文件”);
}
ArrayList结果=新建ArrayList();
File[]filesAndDirs=path.listFiles();
List filesDirs=Arrays.asList(filesAndDirs);
如果(!path.canRead()){
返回结果;
}
对于(int i=0;i
这是错误的,因为当找到第一个隐藏文件夹时,它将停止。我也阅读了实现,它就是这么做的。
public static ArrayList getFilesInDirectoryRec(File path, 
        boolean readHiddenFiles) throws ZipException {

    if (path == null) {
        throw new ZipException("input path is null, cannot read files in the directory");
    }

    ArrayList result = new ArrayList();
    File[] filesAndDirs = path.listFiles();
    List filesDirs = Arrays.asList(filesAndDirs);

    if (!path.canRead()) {
        return result; 
    }

    for(int i = 0; i < filesDirs.size(); i++) {
        File file = (File)filesDirs.get(i);
        if (file.isHidden() && !readHiddenFiles) {
            // The first hidden file causes a return and skipping everything else (!)
            return result;
        }
        result.add(file);
        if (file.isDirectory()) {
            List deeperList = getFilesInDirectoryRec(file, readHiddenFiles);
            result.addAll(deeperList);
        }
    }
    return result;
}