【问题标题】:Zip4j Excluding Folders from ZipZip4j 从 Zip 中排除文件夹
【发布时间】:2016-11-13 20:51:41
【问题描述】:

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

new File("C:\\myHiddenFolder").isHidden();

但是,我不知道如何使用以下基于Zip4j 的方法来跳过添加这些相应的目录:

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();
}

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

【问题讨论】:

    标签: java zip directory ziparchive zip4j


    【解决方案1】:

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

    HiddenDirectoriesMover hiddenDirectoriesMover = new HiddenDirectoriesMover(sourceFilePath);
            hiddenDirectoriesMover.removeFiles();
    
    // Create zip
    
    hiddenDirectoriesMover.returnFiles();
    

    一个肮脏的变通办法,但自从zipParameters.setReadHiddenFiles(false);is not working as expected

    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;
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是错误的,因为它会在找到第一个隐藏文件夹时停止。我也阅读了实现,这就是它的作用。
      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2014-10-13
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      • 2013-05-17
      相关资源
      最近更新 更多