使用 Ruby 归档文件的正确方法是啥?

Posted

技术标签:

【中文标题】使用 Ruby 归档文件的正确方法是啥?【英文标题】:What is the proper way to archive files using Ruby?使用 Ruby 归档文件的正确方法是什么? 【发布时间】:2013-11-16 00:39:59 【问题描述】:

我希望通过 Ruby 为我选择(或允许用户选择)的任何目录制作一个压缩的 *.zip 文件,但我不太确定该怎么做。我确实知道如何创建 *.zip 文件,只是不将实际文件压缩到存档中。我做了一些谷歌搜索,发现了 RubyZip 和其他一些资源,但是 RubyZip 目前处于失败的构建状态,我很好奇它是如何完成的,这样我就不必完全依赖外部资源。非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

“失败的构建状态”是什么意思?最终,rubyzip 依赖于核心 Ruby 中的 zlib、文件实用程序和流式标准库,因此 ruby​​zip 本身是纯 Ruby,无需构建。如果有错误,您可能需要粘贴它。压缩文件和目录是not straightforward,所以 IMO 这实际上是外部库的绝佳候选者。

我似乎没有问题,所以我对你的实际错误很感兴趣。

$ gem install rubyzip
Fetching: rubyzip-1.1.0.gem (100%) yadayada

并且使用source homepage 上示例的略微修改版本,您可以轻松地压缩在命令行中传递的目录(递归):

require 'pathname'
require 'zip'

directory = Pathname.new(ARGV.first)
zipfile_name = "#directory.zip"

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  Dir[File.join(directory, '**', '**')].each do |file|
    path = Pathname.new(file)
    zipfile.add(path.relative_path_from(directory), file)
  end
end

IMO,在这种情况下,答案是使用流行的库并遵循文档。 Rubyzip 最近发生了一些变化,因此您发现的一些建议可能已经过时,或者可能存在一些需要调整的问题。但事实证明,该功能是一个需要重新发明的***。

【讨论】:

好的。我对那个回复有几个问题:1)“路径名”是一个不同的宝石吗? 2) 如果我要传入一个我希望为目录命名的名称(例如 dirname = "backup_#Time.now"),那将如何实现? Pathname 是 Ruby 标准库的一部分。我将它用于relative_path_from 便利方法。如果您想保存带有时间戳的 zip 文件,是的,您可以设置 zipfile_name = "backup_#Time.now.zip",并且您可以将 zipfile.add 中的第一个参数更改为您想要确定文件在 zip 文件中保存位置的任何内容。

以上是关于使用 Ruby 归档文件的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

检测 ruby​​ 是不是在 Windows 上运行的正确方法是啥?

在带有 Xcode 4.3 的 OS X Lion 上安装 Ruby <1.9.3 的正确方法是啥?

用于自动将文档归档到正确文件夹的机器学习方法[关闭]

正确区分压缩的 .gz 文件和归档的 tar.gz 文件?

使用把手引用 css 和 js 文件的正确方法是啥?

在 MFC 项目中使用资源文件的正确方法是啥?