2015-05-20 2 views
3

У меня есть файл tar.gz, сохраненный на диске, и я хочу оставить его там, но мне нужно открыть один файл в архиве, прочитать его и сохранить некоторая информация где-то.Чтение из файла tar.gz без сохранения распакованной версии

File structure: 
base_folder 
    file_i_need.txt 
    other_folder 
    other_file 

код (это не так много - я пытался 10mio различные способы и это то, что слева)

def self.open_file(file) 
    uncompressed_file = Gem::Package::TarReader.new(Zlib::GzipReader.open(file)) 
uncompressed_file.rewind 
end 

Когда я запустить его в консоли я получаю

<Gem::Package::TarReader:0x007fbaac178090> 

и Я могу запускать команды для записей. Я просто не понял, как открыть запись и прочитать ее, не сохраняя ее без распаковки на диск. Мне в основном нужна строка из текстового файла.

Любая помощь приветствуется. Я мог бы просто что-то упустить ...

+2

'TarReader' является' Enumerable', возвращая ['Entry'] (http://ruby-doc.org/stdlib-1.9.3/libdoc/rubygems/rdoc/Gem/Package/TarReader/Entry.html) , Итак, вам нужно будет 'uncompressed_file.detect {| f | f.fullname == 'base_folder/file_i_need.txt'} .read'. – mudasobwa

+0

спасибо. делает полный смысл - не знаю, почему я сам этого не понял. Если вы хотите, чтобы точки поставили это как ответ :) – tomr

+0

Поскольку проблема была решена, я отправил ее в качестве ответа. – mudasobwa

ответ

6

TarReaderEnumerable, возвращение Entry.

Тем не менее, чтобы получить текстовое содержимое из файла по его имени один Мощь

uncompressed = Gem::Package::TarReader.new(Zlib::GzipReader.open(file)) 
text = uncompressed.detect do |f| 
    f.fullname == 'base_folder/file_i_need.txt' 
end.read 
#⇒ Hello, I’m content of the text file, located inside gzipped tar 

Надеется, что это помогает.

+0

Большое спасибо. Я застрял! – tomr

+0

Бывает. Добро пожаловать. – mudasobwa