No commit activity in last 3 years
No release in over 3 years
Ruby bindings to libarchive allowing reading and creation of compressed archives in a variety of formats.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies
 Project Readme

libarchive-ruby-swig

Copyright (c) 2011, Tobias Koch tobias.koch@gmail.com

Description

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.

Installation

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.

Usage Examples

Writing an Archive

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

Reading from an Archive

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.