最近有工作需求,然后自己刚接触 ruby 所以,想找个 ruby 的解压程序,用于解压 1G 以上的.tar.gz 包,结果搜遍度娘、谷歌,收效甚微(答案都是调用外部命令,用 zlib 的很少),无奈之下只有自己用 zlib 动手写了。本人新手,水平浅薄,希望大家刚忙改进,谢谢!(PS:主要是同事用 python 3 行完成,顿时觉得 ruby 资源好少。。。):
require 'rubygems'
require 'rubygems/package'
require 'zlib'
require 'fileutils'
require 'stringio'
def ungzip(gzipfile)
    tarzip_name = File.basename(gzipfile, ".gz")
    gzipfile_path = File.dirname(gzipfile)
    FileUtils.cd(gzipfile_path)
    if File.exist?(tarzip_name) 
        puts "#{tarzip_name} already exists"
        return gzipfile_path << "/" << tarzip_name
    else
        tar_stream = File.open(tarzip_name,"ab+") 
        tarfile = File.open(gzipfile, "rb")
        z = Zlib::GzipReader.new(tarfile)
        while buff = z.read(4096)
            tar_stream.write(buff)
        end
        z.close
        tar_stream.close()
        return gzipfile_path << "/" << tarzip_name
    end 
 end
def untar(tarzip_path_full, destination)
    tarzip_name = File.basename(tarzip_path_full)
    tarzip_path = File.dirname(tarzip_path_full)
    FileUtils.cd(tarzip_path) 
    tar_stream = File.open(tarzip_name)
    Gem::Package::TarReader.new tar_stream 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
# usage :   
tarzip_path_full= ungzip("C:/51/bulids/5000.200/win32_10.2.5000.206_ml.tar.gz")
untar(tarzip_path_full,"C:/51/batch tutorals/My ruby/Test GUI/Test/")
此程序将 tarball 解 gzip 到 tarball 的当前目录,然后解 tar 到指定目录。win7 上测试成功(解压 1G 文件),采用 ruby1.9.3 PS: 我只是想用纯 ruby 写个。。。