1

これは私が試しているコードです。

require 'zlib'
Dir.glob('*.*').each do |file|
  Zlib::GzipWriter.open('output.gz') do |gz|
    gz.mtime = File.mtime(file)
    gz.orig_name = File.basename(file)
    gz.write IO.binread(file)
  end
end

私はこれのさまざまなバリエーションを試しました。オンラインで「複数のファイル」を作成する方法はないようです。ouput.gzの最初のファイル名で終わりますが、ディレクトリの最後のファイルの内容が含まれている可能性があります(わかりません)。しかし、それは要点を超えています。各ファイルを個別のエンティティとして圧縮ファイルに入れたいだけです。クロスプラットフォームとの互換性が高いほど、優れています。

4

2 に答える 2

3

この回答は、RubyGemsライブラリから取得したhttp://old.thoughtsincomputation.com/posts/tar-and-a-few-feathers-in-rubyから取得されています。

require 'rubygems'
require 'rubygems/package'
require 'zlib'
require 'fileutils'

module Util
  module Tar
    # Creates a tar file in memory recursively
    # from the given path.
    #
    # Returns a StringIO whose underlying String
    # is the contents of the tar file.
    def tar(path)
      tarfile = StringIO.new("")
      Gem::Package::TarWriter.new(tarfile) do |tar|
        Dir[File.join(path, "**/*")].each do |file|
          mode = File.stat(file).mode
          relative_file = file.sub /^#{Regexp::escape path}\/?/, ''

          if File.directory?(file)
            tar.mkdir relative_file, mode
          else
            tar.add_file relative_file, mode do |tf|
              File.open(file, "rb") { |f| tf.write f.read }
            end
          end
        end
      end

      tarfile.rewind
      tarfile
    end

    # gzips the underlying string in the given StringIO,
    # returning a new StringIO representing the 
    # compressed file.
    def gzip(tarfile)
      gz = StringIO.new("")
      z = Zlib::GzipWriter.new(gz)
      z.write tarfile.string
      z.close # this is necessary!

      # z was closed to write the gzip footer, so
      # now we need a new StringIO
      StringIO.new gz.string
    end

    # un-gzips the given IO, returning the
    # decompressed version as a StringIO
    def ungzip(tarfile)
      z = Zlib::GzipReader.new(tarfile)
      unzipped = StringIO.new(z.read)
      z.close
      unzipped
    end

    # untars the given IO into the specified
    # directory
    def untar(io, destination)
      Gem::Package::TarReader.new io do |tar|
        tar.each do |tarfile|
          destination_file = File.join destination, tarfile.full_name

          if tarfile.directory?
            FileUtils.mkdir_p destination_file
          else
            destination_directory = File.dirname(destination_file)
            FileUtils.mkdir_p destination_directory unless File.directory?(destination_directory)
            File.open destination_file, "wb" do |f|
              f.print tarfile.read
            end
          end
        end
      end
    end
  end
end


### Usage Example: ###
#
# include Util::Tar
# 
# io = tar("./Desktop")   # io is a TAR of files
# gz = gzip(io)           # gz is a TGZ
# 
# io = ungzip(gz)         # io is a TAR
# untar(io, "./untarred") # files are untarred
#
于 2014-10-23T20:57:21.660 に答える
2

まず、それは上書きを続けoutput.gz、最後のファイルのみが圧縮されたままになります。

第二に、gzip形式は複数のファイルを保持しません。1つだけ保持します。.tar.gzまたは.zip形式 を使用する必要があります。.zipより「クロスプラットフォーム互換」です。rubyzipを見てください。

于 2012-12-19T04:14:29.123 に答える