Sidebar

How can I zip all files in a directory?

0 votes
439 views
asked May 2, 2017 by brandon-w-8204 (33,270 points)

2 Answers

0 votes
 
Best answer

Use the following function to assemble a directory into a zip file. This function uses a FileInputStream to read the bytes and write them vs reading the entire file into memory:

function assembleZipFileStream(zipFilePath,directoryToZip) {
   function addDirectoryFilesStream(baseDirectory, workingDirectory, zipFileStream) {
      // list out all items in directory
      var directory = new java.io.File(baseDirectory + java.io.File.separator + workingDirectory);
      var bytes = new Packages.java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
      var files = directory.listFiles();
      for (var currentFile = 0; currentFile < files.length; currentFile++) {
         // for (var currentFile = 0; currentFile < 2; currentFile++) {
         var file = files[currentFile];
         if (file.isDirectory()) {
            // if directory, add directory to zip and call add directory files
            addDirectoryFilesStream(baseDirectory, workingDirectory + java.io.File.separator + file.getName(), zipFileStream);
         } else {
            // if file, then add to zip
            var inputStream = new java.io.FileInputStream(file);
            try {
               var fileName = file.getName();
               var fullPath = StringUtils.replace(workingDirectory + '\\' + fileName, '\\', java.io.File.separator);
               
               if (StringUtils.startsWithIgnoreCase(fullPath, java.io.File.separator)) {
                  fullPath = StringUtils.substringAfter(fullPath, java.io.File.separator);
               }
               qie.debug('Adding Entry: ' + fullPath);
               var zipEntry = new java.util.zip.ZipEntry(fullPath);
               zipEntry.setSize(file.length());
               // zipEntry.setCreationTime(java.nio.file.attribute.FileTime.fromMillis((new java.util.Date()).getTime()));
               zipEntry.setTime((new java.util.Date()).getTime());
               try {
                  zipFileStream.putNextEntry(zipEntry);
                  
                  var length;
                  while ((length = inputStream.read(bytes)) >= 0) {
                     zipFileStream.write(bytes, 0, length);
                     
                  }
               } finally {
                  zipFileStream.closeEntry();
               }
            } finally {
               inputStream.close();
            }
         }
      }
   }
   
   var zipFileStream = new java.util.zip.ZipOutputStream(new java.io.FileOutputStream(zipFilePath));
   try {
      addDirectoryFilesStream(directoryToZip, '', zipFileStream);
   } finally {
      zipFileStream.finish();
      zipFileStream.flush();
      zipFileStream.closeEntry();
      zipFileStream.close();
   }
}

answered May 8, 2018 by brandon-w-8204 (33,270 points)
edited Apr 6, 2021 by brandon-w-8204
0 votes

Here is sample script on how to do this:

//get all files from a directory
var baos = new java.io.ByteArrayOutputStream();
var zipfile = new java.util.zip.ZipOutputStream(baos);
var zipentry;
var pathToZip = new java.io.File('c:\\temp\\zipTest');

if (!pathToZip.exists()) {
   qie.error("The pickup directory does not exist: " + pathToZip);
} else {
   var files = pathToZip.listFiles();
   // loop through each directory
   for (var i = 0; i < files.length; i++) {
      var file = files[i];
      if (file.isFile()) {
         var fileName = file.getName();
         zipentry = new java.util.zip.ZipEntry(fileName);
         zipfile.putNextEntry(zipentry);
         var fileBytes = qie.readFile(file);
         zipfile.write(fileBytes, 0, fileBytes.length);
      }
   }
}
zipfile.close();
var bytes = baos.toByteArray();

var path = 'c:\\temp\\';
var dir = new java.io.File(path);
if (dir.exists() || dir.mkdirs()) {
   // generate zip file name to be exported ('cq_YYYY-MM-dd_HHNNSSSSS.zip')
   var expName = StringUtils.replace(qie.getSystemDate(), '.', '');
   // expName = StringUtils.substring(expName, 0, 4) + '-' + StringUtils.substring(expName, 4, 6) + '-' + StringUtils.substring(expName, 6, 8) + "_" + StringUtils.substring(expName, 8);
   expName = path + qie.getUUID(true) + '.zip';

   var expFile = new java.io.FileOutputStream(expName, false);
   expFile.write(bytes);
   expFile.close();
   qie.debug("Exported zip file to '" + expName + "'");
}
 

answered May 2, 2017 by brandon-w-8204 (33,270 points)
...