Go to file
Alexander Simonov 4f9b642644 Merge pull request #124 from rubyzip/minitest-refactoring
Tests refactoring
2014-01-20 14:14:31 -08:00
lib Add config to set the default compression level. 2014-01-20 14:38:22 +01:00
samples Refactoring part #2 2013-06-03 10:56:24 +03:00
test Fix tests on JRuby 2014-01-20 23:57:56 +02:00
.gitignore Ignore temp files for default compression test. 2014-01-20 15:14:45 +01:00
.simplecov Split all tests to small files. Move to minitest 2014-01-20 23:31:06 +02:00
.travis.yml Explicitly add the released 2.1.0 Ruby version 2013-12-26 17:34:50 -08:00
Changelog.md Version bump 2013-11-01 16:36:25 +02:00
Gemfile Split all tests to small files. Move to minitest 2014-01-20 23:31:06 +02:00
README.md Add documentation on how to setup the default compression. 2014-01-20 15:23:35 +01:00
Rakefile Split all tests to small files. Move to minitest 2014-01-20 23:31:06 +02:00
TODO Added better support for ruby187 mingw developers 2012-02-06 11:59:11 +11:00
rubyzip.gemspec The NEWS file doesn't exist, so `rake build` wouldn't work. 2013-09-06 15:18:44 -04:00
testAllRubies.sh Fix looping 2012-06-17 20:13:46 +03:00

README.md

rubyzip

Build Status Code Climate Coverage Status

rubyzip is a ruby library for reading and writing zip files.

Important note

Rubyzip interface changed!!! No need to do require "zip/zip" and Zip prefix in class names removed.

If you have issues with any third-party gems what required old version of rubyzip you can use next workaround:

gem 'rubyzip', '>= 1.0.0' # will load new rubyzip version
gem 'zip-zip' # will load compatibility for old rubyzip API.

Requirements

  • Ruby 1.9.2 or greater

Installation

rubyzip is available on RubyGems, so:

gem install rubyzip

Or in your Gemfile:

gem 'rubyzip'

Usage

Basic zip archive creation

require 'rubygems'
require 'zip'

folder = "Users/me/Desktop/stuff_to_zip"
input_filenames = ['image.jpg', 'description.txt', 'stats.csv']

zipfile_name = "/Users/me/Desktop/archive.zip"

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  input_filenames.each do |filename|
    # Two arguments:
    # - The name of the file as it will appear in the archive
    # - The original file, including the path to find it
    zipfile.add(filename, folder + '/' + filename)
  end
  zipfile.get_output_stream("myFile") { |os| os.write "myFile contains just this" }
end

Zipping a directory recursively

require 'rubygems'
require 'zip'

directory = '/Users/me/Desktop/directory_to_zip/'
zipfile_name = '/Users/me/Desktop/recursive_directory.zip'

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
	Dir[File.join(directory, '**', '**')].each do |file|
	  zipfile.add(file.sub(directory, ''), file)
	end
end

Save zip archive entries in sorted by name state

To saving zip archives in sorted order like below you need to set ::Zip.sort_entries to true

Vegetable/
Vegetable/bean
Vegetable/carrot
Vegetable/celery
fruit/
fruit/apple
fruit/kiwi
fruit/mango
fruit/orange

After this entries in zip archive will be saved in ordered state.

Known issues

Modify docx file with rubyzip

Use write_buffer instead open. Thanks to @jondruse

buffer = Zip::OutputStream.write_buffer do |out|
  @zip_file.entries.each do |e|
    unless [DOCUMENT_FILE_PATH, RELS_FILE_PATH].include?(e.name)
      out.put_next_entry(e.name)
      out.write e.get_input_stream.read
     end
  end

  out.put_next_entry(DOCUMENT_FILE_PATH)
  out.write xml_doc.to_xml(:indent => 0).gsub("\n","")

  out.put_next_entry(RELS_FILE_PATH)
  out.write rels.to_xml(:indent => 0).gsub("\n","")
end

File.open(new_path, "w") {|f| f.write(buffer.string) }

Further Documentation

There is more than one way to access or create a zip archive with rubyzip. The basic API is modeled after the classes in java.util.zip from the Java SDK. This means there are classes such as Zip::InputStream, Zip::OutputStream and Zip::File. Zip::InputStream provides a basic interface for iterating through the entries in a zip archive and reading from the entries in the same way as from a regular File or IO object. OutputStream is the corresponding basic output facility. Zip::File provides a mean for accessing the archives central directory and provides means for accessing any entry without having to iterate through the archive. Unlike Java's java.util.zip.ZipFile rubyzip's Zip::File is mutable, which means it can be used to change zip files as well.

Another way to access a zip archive with rubyzip is to use rubyzip's Zip::FileSystem API. Using this API files can be read from and written to the archive in much the same manner as ruby's builtin classes allows files to be read from and written to the file system.

For details about the specific behaviour of classes and methods refer to the test suite. Finally you can generate the rdoc documentation or visit http://rubyzip.sourceforge.net.

Configuration

By default, rubyzip will not overwrite files if they already exist inside of the extracted path. To change this behavior, you may specify a configuration option like so:

Zip.on_exists_proc = true

If you're using rubyzip with rails, consider placing this snippet of code in an initializer file such as config/initializers/rubyzip.rb

Additionally, if you want to configure rubyzip to overwrite existing files while creating a .zip file, you can do so with the following:

Zip.continue_on_exists_proc = true

If you want to store non english names and want to open properly file on Windows(pre 7) you need to set next option:

Zip.unicode_names = true

You can set the default compression level like so:

Zip.default_compression = Zlib::DEFAULT_COMPRESSION

It defaults to Zlib::DEFAULT_COMPRESSION. Possible values are Zlib::BEST_COMPRESSION, Zlib::DEFAULT_COMPRESSION and Zlib::NO_COMPRESSION

All settings in same time

  Zip.setup do |c|
    c.on_exists_proc = true
    c.continue_on_exists_proc = true
    c.unicode_names = true
    c.default_compression = Zlib::BEST_COMPRESSION
  end

Developing

To run tests you need run next commands:

bundle install
rake

Website and Project Home

http://github.com/rubyzip/rubyzip

http://rdoc.info/github/rubyzip/rubyzip/master/frames

Authors

Alexander Simonov ( alex at simonov.me)

Alan Harper ( alan at aussiegeek.net)

Thomas Sondergaard (thomas at sondergaard.cc)

Technorama Ltd. (oss-ruby-zip at technorama.net)

extra-field support contributed by Tatsuki Sugiura (sugi at nemui.org)

License

rubyzip is distributed under the same license as ruby. See http://www.ruby-lang.org/en/LICENSE.txt