libarchive-ruby icon indicating copy to clipboard operation
libarchive-ruby copied to clipboard

= libarchive-ruby

This is libarchive-ruby, your preferred archiving toolkit in Ruby! libarchive-ruby is a Ruby binding to the famous {libarchive library}[http://code.google.com/p/libarchive/] and supports nearly all features the library exposes through it's C++ interface.

librarchive-ruby focuses on a clean and ruby-like syntax that makes it trivial to create, read, write and extract archive files of various formats. Want to know more? Keep reading!

== Prerequesites

In order to successfully install libarchive-ruby, you need the following:

  • Ruby >= 1.8.7
  • A C++ compiler (we use the {GNU project's}[http://www.gnu.org] g++)
  • libarchive (we tested with 2.8.4)

== How to install?

=== RubyGems

This is the easiest and preferred way. Ensure you have a proper built environment for C++ code, and then do

gem install libarchive-ruby

=== Building from source

If you want to be on the bleeding etch, clone the our {git repository at GitHub}[https://github.com/Hanmac/libarchive-ruby]:

$ git clone https://github.com/Hanmac/libarchive-ruby.git $ cd libarchive-ruby

Then you can either choose to use the library from that directory by running

$ rake compile

or to make a gem and install that one.

$ rake gem

gem install --local pkg/libarchive-ruby-x.x.x

== How to use?

First, you have to require the library:

require "archive" #Note this is NOT "libarchive-ruby"

Then you can use the beautiful rubyish API:

=== Read an archive

Assuming, you have "myarchive.tar.bz2" in the current directory.

a = Archive.new("myarchive.tar.bz2") puts "This archive contains:" a.each{|entry| puts entry}

#Archive includes the Enumerable module, making available all that #nice enumerating functionality: puts All entries in uppercase are: puts a.map{|entry| entry.path.upcase}.join("\n")

#Furthermore, you can even read from the files contained in the #archive without actually extracting it: a.each{|entry, data| puts "Content of #{entry} is: #{data}"}

=== Extract an archive

Assuming you have "myarchive.tar.bz2" in the current directory.

a = Archive.new("myarchive.tar.bz2")

#Extract all files to the current directory a.extract

#Extract a specific file a.extract("mydir/myfile")

#Restrict what file attributes are extracted: a.extract(:extract => Archive::EXTRACT_OWNER | Archive::EXTRACT_TIME)

#Extract only files whose path is longer than 5 characters a.extract_if{|entry| entry.path.size > 5}

=== Create an archive

Assuming you have three files "a.rb", "b.cpp" and "README.rdoc" in your current directory:

a = Archive.new("myarchive.tar.gz") a << "a.rb" << "b.cpp" << "README.rdoc"

If you have more than one file to add you can use an Array:

a = Archive.new("myarchive.tar.gz") a << ["a.rb", "b.cpp", "README.rdoc"]

You can manipulate the entry witch is added to the file:

a = Archive.new("myarchive.tar.gz") a.add("a.rb") {|entry| entry.mtime = Time.now }

#Note how libarchive-ruby automatically picked up the archive format #you wanted by examining the file extension: a = Archive.new("myarchive.tar.gz") puts a.format_name #=> POSIX ustar format

== Further reading

Have a look at the documentation for the Archive and Archive::Entry classes for more information.

== Contributors

The following people have worked on libarchive-ruby beside me:

  • Quintus <sutniuq ÄT gmx DÖT net> contributed to the docs

== License

libarchive-ruby is a Ruby binding for the C library libarchive.

Copyright © 2011 Hans Mackowiak

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

=== Contact

You can read me via the email address hanmac ÄT gmx DÖT de.