Search code examples
rubyarchiverubyzip

RubyZip: archiving process indication


I am adding tons of file to my archive it looks like this:

print "Starting ..."
Zip::ZipFile.open(myarchive, 'w') do |zipfile|
  my_tons_of_files.each do |file|
    print "Adding #{file.filename} to archive ... \r"
    # ...
  end
  print "\n Saving archive"
  # !!! -> waiting about 10-15 minutes
  # but I want to show the percentage of completed job
end

After all files are added to my archive it starts to compress them all (about 10-15 minutes).

How can I indicate what is actually going on with rubyzip gem (actually I want to show percentage like current_file_number/total_files_count).


Solution

  • You can override Zip::ZipFile.commit:

    require 'zip'
    require 'zip/zipfilesystem'
    
    module Zip
    class ZipFile
    
        def commit
         return if ! commit_required?
          on_success_replace(name) {
            |tmpFile|
            ZipOutputStream.open(tmpFile) {
              |zos|
    
              total_files = @entrySet.length
              current_files = 1
              @entrySet.each do |e|
                 puts "Current file: #{current_files}, Total files: #{total_files}"
                 current_files += 1
                 e.write_to_zip_output_stream(zos)
              end
              zos.comment = comment
            }
            true
          }
          initialize(name)
        end
    
    end
    end
    
    print "Starting ..."
    Zip::ZipFile.open(myarchive, 'w') do |zipfile|