zip文件的压缩与解压缩
使用了扩展库rubyzip实现
安装:gem install rubyzip
文件的压缩步骤为:使用zipfile的open方法打开zip文件,调用add方法添加文件到压缩文件
解压缩步骤为:打开zip文件,掉用zipfile的each方法,然后利用迭代传进来的zipentry对象调用extract方法
代码如下
压缩文件:
require 'zip/zip' class ZipUtil # 压缩文件方法 # zip_file_name 压缩文件绝对路径,含文件名 # file_path 要解压的目录或文件 def self.add_to_zip_file(zip_file_name,file_path) # start_path 表示 def self.add_file(start_path,file_path,zip) # 如果文件是一个目录则递归调用此方法 if File.directory?(file_path) # 建立目录 # 如果省略下一行代码,则当目录为空时,此目录将不会显示在压缩文件中 zip.mkdir(file_path) puts "建立目录#{file_path}" Dir.foreach(file_path) do |filename| #递归调用add_file方法 add_file("#{start_path}/#{filename}","#{file_path}/#{filename}",zip) unless filename=="." or filename==".." end else # 给压缩文件中添加文件 # start_path 被添加文件在压缩文件中显示的路径 # file_path 被添加文件的源路径 zip.add(start_path,file_path) puts "添加文件#{file_path}" end end # 如果文件已存在,则删除此文件 if File.exist?(zip_file_name) puts "文件已存在,将会删除此文件并重新建立。" File.delete(zip_file_name) end # 取得要压缩的目录父路径,以及要压缩的目录名 chdir,tardir = File.split(file_path) # 切换到要压缩的目录 Dir.chdir(chdir) do # 创建压缩文件 puts "开始创建压缩文件" Zip::ZipFile.open(zip_file_name,Zip::ZipFile::CREATE) do |zipfile| puts "文件创建成功,开始添加文件..." # 调用add_file方法,添加文件到压缩文件 puts "已添加文件列表如下:" add_file(tardir,tardir,zipfile) end end end end
调用方法及输出如下:
# 参数1:压缩文件的全路径名,参数2:要压缩的目录名 ZipUtil.add_to_zip_file("d:/test.zip","d:/test") output: 开始创建压缩文件 文件创建成功,开始添加文件... 已添加文件列表如下: 建立目录test 添加文件test/rubytest.xml 添加文件test/test.txt 添加文件test/test.xml 建立目录test/testdir
解压缩代码:
require 'zip/zip' class ZipUtil # 解压文件方法 # zif_file_path 压缩文件的访问路径 # extract_directory 解压文件的保存目录 def self.extract_from_zip_file(zif_file_path,extract_directory) unless File.exist?(zif_file_path) puts "文件:#{zif_file_path}不存在." return 0 end Dir.mkdir(extract_directory) unless File.exist?(extract_directory) puts "解压文件开始,输出目录为#{extract_directory}." Zip::ZipFile.open(zif_file_path) do |zif_file| zif_file.each do |entry| # 通过下句打印可知,entyr是Zip::ZipEntry的对象 # puts entry.class # 利用File.join构建文件存放的路径,路径为存放目录加上压缩文件的相对路径 print "解压文件#{entry::name}......" entry.extract(File.join(extract_directory,entry::name)) puts "OK" end end puts "解压文件完成!" end end
调用及输出如下:
# 解压缩文件 ZipUtil.extract_from_zip_file("d:/test.zip","d:/ext") 解压文件开始,输出目录为d:/ext. 解压文件test/......OK 解压文件test/rubytest.xml......OK 解压文件test/test.txt......OK 解压文件test/test.xml......OK 解压文件test/testdir/......OK 解压文件完成!
YAML的读取
在YAML中,层次结构通过缩进来表示,连续的项目通过减号‘-’表示,数组使用[],Hash使用{}
常用方法有
YAML.dump(objd) 将obj转化为YAML格式字符串
YAML.load(str) 解析YAML格式字符串,还原为ruby对象
YAML.load_file(filename) 直接读取YAML文件,还原ruby对象
例:
require 'yaml' class YamlUtil #构造方法,传递进来YAML文件路径,保存文件对象 def initialize(yaml_file_name) @yaml_file = File.new(yaml_file_name,"w+") end #把obj格式化为YAML字符串并增加进保存的YAML文件对象 def add_obj_to_yaml_file(obj) YAML.dump(obj, @yaml_file) end #关闭文件 def close_file @yaml_file.close end #类方法,打印所提供的YAML文件内容 def self.print_yaml_file(yaml_file_name) #一个包含有YAML文件的内容的ruby对象,类型与保存时的类型相同 yaml_data = YAML.load_file(yaml_file_name) #对数据进行遍历,此为一个数组对象 yaml_data.each do |item| #打印其中的Hash的值 puts "name:#{item[:name]},age:#{item[:age]}" end end end yaml_file = "d:/test.yaml" yi = YamlUtil.new(yaml_file) #构造Hash,并填充内容 obj = [] obj<<{:name=>"张三",:age=>"20"} obj<<{:name=>"李四",:age=>"22"} #将保存有Hash对象的数组,保存入YAML文件 yi.add_obj_to_yaml_file(obj) #关闭文件 yi.close_file #读取文件并输出文件的内容 YamlUtil.print_yaml_file(yaml_file)
输出为:
name:张三,age:20 name:李四,age:22