!include once #1034352 // zip4j srecord noeq Zip4j_CopySubSetOfZipFile(File zipIn, File zipOut, IPred fileFilter) { run { var zipModel = new net.lingala.zip4j.ZipFile(zipIn); temp outputStream = new SplitOutputStream(zipOut); temp inputStream = new RandomAccessFile(zipModel.getZipFile(), RandomAccessFileMode.READ.getValue()); long currentFileCopyPointer = 0; L sortedFileHeaders = sortedByComparator(zipModel.getCentralDirectory().getFileHeaders(), (o1, o2) -> { if (eq(o1.getFileName(), o2.getFileName())) ret 0; ret cmp(o1.getOffsetLocalHeader(), o2.getOffsetLocalHeader()); }); for (fileHeader : sortedFileHeaders) { long lengthOfCurrentEntry = getOffsetOfNextEntry(sortedFileHeaders, fileHeader, zipModel) - outputStream.getFilePointer(); if (!fileFilter.get(fileHeader.getFileName())) { updateHeaders(sortedFileHeaders, fileHeader, lengthOfCurrentEntry); if (!zipModel.getCentralDirectory().getFileHeaders().remove(fileHeader)) { throw new ZipException("Could not remove entry from list of central directory headers"); } currentFileCopyPointer += lengthOfCurrentEntry; } else { // copy complete entry without any changes currentFileCopyPointer += super.copyFile(inputStream, outputStream, currentFileCopyPointer, lengthOfCurrentEntry, progressMonitor, taskParameters.zip4jConfig.getBufferSize()); } } headerWriter.finalizeZipFile(zipModel, outputStream, taskParameters.zip4jConfig.getCharset()); } long getOffsetOfNextEntry(L sortedFileHeaders, FileHeader fileHeader, ZipModel zipModel) throws ZipException { int indexOfFileHeader = getIndexOfFileHeader(sortedFileHeaders, fileHeader); if (indexOfFileHeader == sortedFileHeaders.size() - 1) ret HeaderUtil.getOffsetStartOfCentralDirectory(zipModel); else ret sortedFileHeaders.get(indexOfFileHeader + 1).getOffsetLocalHeader(); } long copyFile(RandomAccessFile randomAccessFile, OutputStream outputStream, long start, long length, ProgressMonitor progressMonitor, int bufferSize) throws IOException { net.lingala.zip4j.util.FileUtils.copyFile(randomAccessFile, outputStream, start, start + length, progressMonitor, bufferSize); ret length; } }