`
酷的飞上天空
  • 浏览: 517944 次
  • 性别: Icon_minigender_1
  • 来自: 无锡
社区版块
存档分类
最新评论

ruby学习之IO(二)

阅读更多

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

 

 

 

分享到:
评论

相关推荐

    Ruby学习笔记

    这个暑假回家没事干闲...恩,废话就少提,下面我学习Ruby的各个部分。其中Ruby风格这一部分是开放的,因为我暂时还没有形成自己的风格。我用xmind来记笔记,因此我只是把笔记搬到博客上,看看下面的图。好有爱啊!!!

    Ruby版本管理工具RVM的安装和使用教程

    如果你打算学习 Ruby / Rails, RVM 是必不可少的工具之一。 这里所有的命令都是再用户权限下操作的,任何命令最好都不要用 sudo. RVM 安装 $ curl -L get.rvm.io | bash -s stable $ source ~/.bashrc $ source ~/....

    book-of-ruby:来自《Ruby 之书》一书的源代码

    Ruby之书 这是《Ruby 之书》一书... Ruby 以易于学习而闻名,但大多数用户只触及了它可以做的事情的皮毛。 其他书籍侧重于 Ruby 的时尚特性,而 The Book of Ruby揭示了世界上最流行的编程语言之一的秘密内部工作原理,

    rubyschool.io:Ruby School网站,正在运行,但还有很多工作要做

    rubyschool.github.io 在网络上: : 是的,一开始它会像是的分支。 但是NodeJS社区做得很好,我们需要向他们学习一些东西。 基本思想-具有与他们相同的活动类型,与Ruby和宝石一样,建立。 请分叉并将其发送给我们...

    Ruby的安装与运行

    版本控制系统:rvm(rvm.io)、rbenv rvm 查看ruby版本 rvm list known 安装 rvm install 2.2.1 帮助 rvm --help 用户手册 : man rvm rbenv OSX下用brew安装 windows下安装通过rubyInstaller 学习资料 ...

    demonlife.github.io:学习笔记-博客

    什么是八达通? Octopress 是最好的... 注意:Octopress 需要最低 Ruby 版本1.9.3-p0 。 文档 查看以获取指南和文档。 它应该都适用于我们当前的稳定版本(在master分支中找到)。 如果不是这种情况,。 贡献 我们

    ichinoe.github.io:域页面

    关于IO 根本解释 该项目中使用的技术很简单,没有值得学习的东西。 如果您对它的效果感到好奇,请不要浪费时间。 ... 我正打算上传我的一些关于Ruby学习的笔记。 但是在此之前,我必须先谈谈HTML。

    orlandodevs.github.io:Orlando Devs网站和博客

    orlandodevs.github.io 奥兰多开发公司的网站和博客: : 入门 该项目使用jekyll ,这意味着您将需要安装ruby开发环境。 在.ruby-version或Gemfile查看所需的Ruby.ruby-version 。 您可以运行ensure_env_...

    examples:sylabs.io博客中用于创建和使用示例容器的文件和说明

    例子 在此处,您可以从找到有关创建和使用示例容器的文件和说明。 ...机器学习 咖啡 侦探 过氧化氢 霍罗沃德 英特尔-Tensorflow Jupyter笔记本 橙色数据挖掘 火花 威卡 消息代理 兔子MQ 包装 FPM

    trail-map, 帮助设计师和开发人员学习各种主题的轨迹.zip

    trail-map, 帮助设计师和开发人员学习各种主题的轨迹 轨迹图如何学习 Ruby on Rails? Vim测试驱动开发?我们的apprentice.io 强迫我们形式化对这些问题的回答。一些问题使这些问题难以回答。 个人:具有不同的体验...

    teaxwin.github.io

    hello是一个极简主义的模板,可让您在GitHub Pages上设计漂亮的网站或产品组合-无需安装Ruby开发环境,学习使用Jekyll或什至无需输入一行代码。 对于想要在上开始建立自己的个人网站但对Web开发不太熟悉的...

    RoR_julia_eg:通过 ZMQ 使用 Julia 链接的 Ruby on Rails Web 应用程序示例

    我只是在学习,我希望这篇文章对你有所帮助。 欢迎所有反馈! 基本上,我们在 Julia 中创建了一个 ZMQ 服务器,它将按照网页的指示执行一些预定义的计算。 在这种情况下,提供一个数字并将其神奇地乘以 3 :) 这...

    learntoprogram:我在 Chris Pine 的《学习编程》第二版中工作时的代码片段

    学习编程我在 Chris Pine 的 Lear to Program 中工作时的代码片段,第二版第02章 - 数字简单算术导论整数和浮点数第05章 混合铸造/转换简介带有 get 和 chomp 的用户输入第 06 章 - 关于方法的更多信息字符串方法...

    yzalvin.github.io:网站

    yzalvin.github.io 我建立了这个网站,所以我可以在线保存我的笔记,也许还可以开始学习一些Ruby。 以后也可能是投资组合。

    toucan:一个Ruby框架,可制作小型但令人赞叹的CLI应用程序。 (工作正在进行中)

    下一步最常见的方法之一就是研究解决方案,但这听起来常常像是用大炮杀死一只蚂蚁,而且这并非没有小的(但存在的)学习曲线。 还有其他十二个含义。 就个人而言,我发现同步IO是常见CLI的最讨厌的限制。 如果在...

    minchao920917.github.io:个人博客

    听说用github.io可以建造自己的博客,后来发现很多坑,,首先需要自己学习jekyll的相关知识,html + css + js基础不说,还要学markdown,这还不算坑,最坑的是要学jekyll语法还有Ruby的相关东西以及gems的东西,幸好...

    java8集合源码-fanspaceshow.github.io:学习笔记

    学习经验  Java org.springframework.util.FileCopyUtils  JavaScript  jQuery  Android  Python  PHP  Ruby-Jekyll  CSS  elFinder  Ubuntu  CentOS  VPS  数据库  正则表达式 MiniDao 技术贴 ...

    七周七语言

    内容简介:, 从计算机...了解多门语言蕴涵的思维方式,在编码中互相借鉴,再挑出一两门对自己口味的语言深入学习,这些已经成为在软件行业中安身立命之本。从这个意义上说,每个程序员都应该看看这本《七周七语言》。

    cindyko226.github.io

    我是一位软件开发人员,对编码,学习新技术和实现这些技能有着极大的热情。 我能够使用Javascript,Ruby on Rails,PostgreSQL,mongoDB,Express,Node.js,HTML / CSS / SASS,AWS和React / Redux构建Web应用程序...

    osugi-han.github.io

    osugi-han.github.io &lt;title&gt; Progate &lt;/ title&gt; 学习编码。 学习创造力。 Progateはオンラインプログラグンミ学习サービスです。初心者にもやさしいスライドとレッスンで,ウェブサービスを作りなが...

Global site tag (gtag.js) - Google Analytics