From: Simon Mullis Date: 2007-09-28T23:44:47+09:00 Subject: Re: repost: minitar - how to extract only one file from a tar archive as an object Hi Anyone have any examples of using rubyzip with a stringio object of a zip (that I've just extracted from elsewhere using Minitar)... I cannot seem to force it to accept a non-File object. Anyone offer any inspiration? Thanks SM On 9/28/07, Simon Mullis wrote: > Great! This is exactly what I was looking for! > > Thankyou. > > SM > > On 9/28/07, Raf Coremans wrote: > > 2007/9/28, Simon Mullis : > > > > > > trying again.... > > > > > > ;-) > > > > > > SM > > > > > > ---------- Forwarded message ---------- > > > From: Simon Mullis > > > 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 > > > > > > > > > # lifted from the minitar source... > > > require 'archive/tar/minitar' > > > include Archive::Tar > > > > > > a = File.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 > > > > > > > > > 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 = File.open("test.tar", "rb") > > Minitar::Input.open(a) do |inp| > > inp.each do |entry| > > if entry.full_name =~ /baz/ > > f = StringIO.new( entry.read) > > #Do something useful with f > > end > > end > > end > > > > > > Regards, > > Raf > > > > > -- > Simon Mullis > _________________ > simon@mullis.co.uk > > -- Simon Mullis _________________ simon@mullis.co.uk