Ruby: создайте архив с архивом - PullRequest
19 голосов
/ 11 июля 2009

Каков наилучший способ создания архива tar в формате gzipped с Ruby?

У меня есть приложение Rails, которое должно создавать сжатый архив в ответ на действия пользователя. В идеале, было бы возможно записать непосредственно в сжатый файл без необходимости сначала создавать промежуточные временные файлы. Библиотека Ruby Zlib поддерживает прямое сжатие gzip. Как я могу совместить это с выводом смолы?

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

Например, верхний результат поиска Google для "ruby tar" дает эту ветку , которая была запущена в 2007 году без видимого разрешения.

Другой результат поиска с высоким рейтингом - , описывающий ruby ​​tar . Оно датируется 2002 годом, и это объявление не внушает доверия.

Я также видел различные сообщения об оболочке в unix tar и тому подобное.

Итак, я знаю, что есть много способов сделать это, но я действительно ищу рекомендацию для наиболее надежного и удобного из тех, кто попробовал несколько альтернатив.

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 11 июля 2009

Если вы работаете в Unix, вы можете записать файлы на диск, а затем запустить системный вызов tar / gzip.

`tar -czf #{file_name}.tar.gz #{file_name}`
5 голосов
/ 11 июля 2009

Этот Ruby Minitar проект был обновлен в 2009 году и, похоже, решит вашу проблему

1 голос
/ 16 марта 2018

В следующем примере показано, как объединить класс GzipWriter из Ruby Zlib и класс TarWriter из RubyGems для создания архива gzipped tar:

require 'rubygems/package'

filenames_and_contents = {
  "filename" => "content",
}

File.open("archive.tar.gz", "wb") do |file|
  Zlib::GzipWriter.wrap(file) do |gzip|
    Gem::Package::TarWriter.new(gzip) do |tar|
      filenames_and_contents.each_pair do |filename, content|
        tar.add_file_simple(filename, 0644, content.length) do |io|
          io.write(content)
        end
      end
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...