------art_123_11983036.1190980655332
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

2007/9/28, Simon Mullis <simon / mullis.co.uk>:
>
> trying again....
>
> ;-)
>
> SM
>
> ---------- Forwarded message ----------
> From: Simon Mullis <simon / mullis.co.uk>
> Date: Sep 27, 2007 4:16 PM
> Subject: minitar - how to extract only one file from a tar archive as an
> object
> To: ruby-talk / ruby-lang.org
>
>
> Ahoy there, fellow rubyphiles...
>
> I'm trying to use Archive::Tar::Minitar to extract a single file from
> a tar archive:
>
> "test.tar" contains:
>
> ./test/foo
> ./test/bar
> ./test/baz
>
> <code>
> # lifted from the minitar source...
> require 'archive/tar/minitar'
> include Archive::Tar
>
> a  ile.open("test.tar", "rb")
> Minitar::Input.open(a) do |inp|
>     inp.each do |entry|
>        inp.extract_entry(".", entry) if entry.full_name /baz/
>     end
> end
> </code>
>
> This all works fine, and writes to "./test/baz"
>
> But!
>
> How could I do the same and create a File object of the extracted
> file? (i.e. not write anything to disk).
>
> (The reason I ask is the file I want is a zip, which lives inside the
> tar archive and I then want to grab some files from that using the
> 'rubyzip' gem.)
>
> It's quite possible (in fact, more than likely) that I've missed
> something obvious and there is already a straightforward way to do
> this.
>
> To be honest, a few more examples of minitar in use would be great.
>
> Many thanks in advance for any pointers or tips.
>
> Cheers!
>
> --
> Simon Mullis
> _________________
> simon / mullis.co.uk
>
>

Hi,


Use entry.read instead of inp.extract_entry; this will not extract the file
to disk, but returns its contents as a string. And if wanted, you can wrap
that string in a StringIO to get a file-like object:

require 'archive/tar/minitar'
include Archive::Tar

require 'stringio'

a  ile.open("test.tar", "rb")
Minitar::Input.open(a) do |inp|
  inp.each do |entry|
    if entry.full_name /baz/
      f  tringIO.new( entry.read)
      #Do something useful with f
    end
  end
end


Regards,
Raf

------art_123_11983036.1190980655332--