Copyright (c) 2011, Tobias Koch [email protected]
Ruby bindings to libarchive allowing reading and creation of compressed archive files of various formats. This gem uses SWIG to generate the bindings from a C++ wrapper around libarchive. It is mostly interface-compatible with the Libarchive/Ruby gem by Sugawara Genki.
Install the gem
gem install libarchive-ruby-swig
or clone the git source repository
git clone git://github.com/tobijk/libarchive-ruby-swig.git
and then build and install
gem build libarchive-ruby-swig.gemspec
gem install libarchive-ruby-swig-<version>.gem
Please mind that you need to install SWIG and the development files for libarchive in order to compile the native extension.
The following example shows how to recursively pack everything from the current working directory into a bzip2-compressed tarball:
require 'libarchive_rs'
Archive.write_open_filename('../test.tar.bz2', Archive::COMPRESSION_BZIP2, Archive::FORMAT_TAR) do |ar|
Dir.glob('**/*').each do |fn|
ar.new_entry do |entry|
entry.copy_stat(fn)
entry.pathname = fn
ar.write_header(entry)
if entry.file?
open(fn) do |f|
ar.write_data { f.read(1024) }
end
end
end
end
end
The following example shows how to extract all files from the given archive to the current working directory:
require 'libarchive_rs'
Archive.read_open_filename(filename) do |archive|
while entry = archive.next_header
path = entry.pathname.sub(/^\//, '')
if entry.directory?
Dir.mkdir path unless File.directory? path
elsif entry.symbolic_link?
File.symlink(entry.symlink, path)
else
File.open(path, 'w+') do |fp|
archive.read_data(1024) {|data| fp.write(data)}
end
end
File.chmod(entry.mode, path) unless entry.symbolic_link?
end
end
Note that this example doesn't treat special entries, such as device nodes, correctly.