From: Simon Mullis Date: 2007-09-28T21:55:30+09:00 Subject: Re: repost: minitar - how to extract only one file from a tar archive as an object 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