使用Ruby on Rails在目录中压缩文件

时间:2012-07-18 18:09:42

标签: ruby-on-rails ruby zip

我正在尝试使用RubyZip压缩目录中包含的所有文件。这就是我所拥有的:

def bundle
      #create the ZIPfile with the title of (:id).zip
bundle_filename = "public/attachments/#{self.id}/#{self.id}.zip"

      #open the ZIPfile in order to add items in
Zip::ZipFile.open(bundle_filename, Zip::ZipFile::CREATE) {
  |zipfile|
    Dir.foreach("public/attachments/#{self.id}") do |item|
    t = File.open(item)
    zipfile.add(t, "public/attachments/#{self.id}")
    end
  }

    #change permissions on ZIPfile
  File.chmod(0644, bundle_filename)
  self.save
  end

这会成功执行第一行并使用正确的名称创建zip文件,但不会添加该目录中包含的所有文件。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

让您的生活更轻松,并在ruby方法中使用命令行函数:

在这个实现中,我正在压缩rails目录,所以我在Rails函数的帮助下访问该目录的完整路径。您可以自己指定整个路径。

path = Rails.root.to_s + "/public/tmpFiles"
archive = path + "/tempFilesArchive.zip"
puts "Path: #{path}"
puts "Archive: #{archive}"
`rm "#{archive}"` # remove the archive file, if it exists.
`zip -rj "#{archive}" "#{path}"` # zip the contents of the directory

这应该创建一个名为" tempFilesArchive.zip"的zip文件。在您压缩的同一目录中。

答案 1 :(得分:1)

我不知道这是否是最正确的方法,但这对我有用。 这会压缩zip中的dir中的所有文件和文件夹

  require 'zip/zip'

   def bundle
      bundle_filename = "abc.zip"
      FileUtils.rm "abc.zip",:force => true
      dir = "testruby"
      Zip::ZipFile.open(bundle_filename, Zip::ZipFile::CREATE) { |zipfile|
        Dir.foreach(dir) do |item|
          item_path = "#{dir}/#{item}"
          zipfile.add( item,item_path) if File.file?item_path
        end
      }
     File.chmod(0644,bundle_filename)
   end