最近有工作需求,然后自己刚接触 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 写个。。。