Skip to content
Ruby bindings to libarchive using SWIG
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
ext/libarchive-ruby-swig
lib
test
Changelog
LICENSE
README.md
Rakefile
libarchive-ruby-swig.gemspec
rubygem-libarchive-ruby-swig.spec

README.md

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.

You can’t perform that action at this time.