Ruby 新手发个纯 ruby 写的 tarball 解压程序,希望大家帮忙改进,谢谢!

shane51 · 2013年08月30日 · 最后由 shane51 回复于 2013年08月30日 · 2938 次阅读

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

#1 楼 @cantin 恩,谢谢,我试了下,可以解,不过好像是解到内存了,没有写到磁盘上。之前,这个帖子还看过,呵呵,但是没注意后面还有。不知道写到磁盘上,按照这个链接上的方法改怎么改?

#2 楼 @shane51 我不生产代码,我是 SO 的搬运工。 😄

entry 应该可以拿到内容,然后用写文件的方法将它的内容写到硬盘里?

常见的解压方式是先写到/tmp,完成后再 mv

#4 楼 @nouse Thanks, 我下次改下

...我还以为是一步呢……这样还不如直接装个 7z 然后命令行

#6 楼 @Kabie 之前就是用 BAT +7zip 的写的脚本,本人只是初学 ruby,水平浅薄,现在想用 ruby 重写执之前的脚本,相当于学习了,看到 python 有自己的解压 tarball, 然后发现 ruby 的很少,只有个 rubyzip 和 minitar,然后就想着写一个。确实如果只是用的话,7zip 更方便。

为什么不直接调用 shell 呢?

def ungzip(gzipfile)
  `unzip #{gzipfile}`
end

def untar(tarzip_path_full, destination)
  `tar xf #{tarzip_path_full} --directory=#{destination}`
end

#8 楼 @huacnlee 恩,谢谢,学了一手 linux 下的。用纯 ruby 的初衷是,我是看到 python 有自己的库,直接调用,所以,就想自己写个玩,呵呵。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号