rubyzip 压缩文件夹时遇到Errno::EACCES (Permission denied @ rb_sysopen -

最近在做下载html页面的时候,用了rubyzip包,它的说明文档里有这样一段可以直接拿来用的

require ‘zip‘
# This is a simple example which uses rubyzip to
# recursively generate a zip file from the contents of
# a specified directory. The directory itself is not
# included in the archive, rather just its contents.
#
# Usage:
#   directory_to_zip = "/tmp/input"
#   output_file = "/tmp/out.zip"
#   zf = ZipFileGenerator.new(directory_to_zip, output_file)
#   zf.write()
class ZipFileGenerator
  # Initialize with the directory to zip and the location of the output archive.
  def initialize(input_dir, output_file)
    @input_dir = input_dir
    @output_file = output_file
  end

  # Zip the input directory.
  def write
    entries = Dir.entries(@input_dir) - %w(. ..)

    ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |zipfile|
      write_entries entries, ‘‘, zipfile
    end
  end

  private

  # A helper method to make the recursion work.
  def write_entries(entries, path, zipfile)
    entries.each do |e|
      zipfile_path = path == ‘‘ ? e : File.join(path, e)
      disk_file_path = File.join(@input_dir, zipfile_path)
      puts "Deflating #{disk_file_path}"

      if File.directory? disk_file_path
        recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
      else
        put_into_archive(disk_file_path, zipfile, zipfile_path)
      end
    end
  end

  def recursively_deflate_directory(disk_file_path, zipfile, zipfile_path)
    zipfile.mkdir zipfile_path
    subdir = Dir.entries(disk_file_path) - %w(. ..)
    write_entries subdir, zipfile_path, zipfile
  end

  def put_into_archive(disk_file_path, zipfile, zipfile_path)
    zipfile.get_output_stream(zipfile_path) do |f|
      f.write(File.open(disk_file_path, ‘rb‘).read)
    end
  end
end

于是按照说明直接使用,我的代码如下:

report_path = "path/folder" # 某个path下的folder
output_file = Rails.root.join(download_path, "report.zip")
File.delete(output_file) if File.exists?(output_file)
zf = ZipFileGenerator.new(report_path, output_file)
zf.write()

这时出现了Errno::EACCES (Permission denied @ rb_sysopen的错误。

它的意思应该是没有权限打开文件。

按照这个思路分析,去排查权限的问题,但权限都是正常的,没有什么问题。

再去看说明文档,发现了其中的原由,文档里有这么一段:

# Usage:
#   directory_to_zip = "/tmp/input"
#   output_file = "/tmp/out.zip"
#   zf = ZipFileGenerator.new(directory_to_zip, output_file)
#   zf.write()

这说明directory_to_zip和output_file都是string对象。

而我传入的Rails.root.join(download_path, "report.zip"),是一个Pathname对象,这导致了错误的出现。

我们平常在rails里较为常用的Rails.root.join和File.join的区别就是返回的对象不同,并且Rails.root使用时也可以像字符一样,以致我都认为它就是返回的字符串,所以才导致了这样的错误,以后还是要仔细些才行,不要再犯同样的错误,特此mark一下。

原文地址:https://www.cnblogs.com/limx/p/9059896.html

时间: 2024-10-25 19:31:40

rubyzip 压缩文件夹时遇到Errno::EACCES (Permission denied @ rb_sysopen -的相关文章

【原创】linux压缩文件夹时排除特定文件夹

linux下压缩解压文件这是非常常用的命令,我们需要很经常的来打包文件做转移或者其他的什么操作. 有时公司的程序员需要把正在运行网站的程序下载下来,需要打包,但是比如备份文件夹有十几G,上传图片的文件夹也很大,总不能把其他文件夹写上一遍吧? 通过查找,我也找到两种方法,在这里和大家分享一下 1. $(ls | grep -v xx) tar -zcf tmp.tgz $(ls | grep -v xx) grep -v :反检索,只显示不匹配的行.这样就排除了特定的文件夹.这个方法也适用与zip

VSCODE更改文件时,提示EACCES permission denied的解决办法(mac电脑系统)

permission denied:权限问题 具体解决办法: 1.在项目文件夹右键-显示简介-点击右下角解锁 2.权限全部设置为读与写 3.最关键一步:点击"应用到包含的项目",这样就会把读与写权限应用到项目下的所有文件,然后就OK了 原文地址:https://www.cnblogs.com/eternityz/p/12239567.html

Beyond Compare同步压缩文件夹的步骤

Beyond Compare是一款功能强大的对比软件,其中压缩文件和其他文档类型,和对比普通文件夹相同,都可以内置扩展用于对比和更新它们的内容.那么在使用Beyond Compare软件进行文件夹同步操作时,压缩文件夹也可以同步吗?本节内容主要讲解,设置Beyond Compare同步压缩文件的操作方法. 具体操作步骤如下所示 步骤一:打开Beyond Compare软件,选择文件夹同步会话,打开会话操作界面.单击“浏览”按钮选择需要同步的文件夹,如下图图例所示,左右两侧窗格内的压缩文件以普通文

简单测试Demo:如何用Java压缩文件夹和文件

一.直接贴出测试代码 1 package com.jason.zip; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.util.ArrayList; 9 import java.util.List; 10 i

C#压缩文件夹

using System;using System.Collections.Generic;using System.Text; ///第三方dllusing ICSharpCode.SharpZipLib;using ICSharpCode.SharpZipLib.Checksums;using ICSharpCode.SharpZipLib.Zip;using System.IO;using log4net;using log4net.Config;using System.Text.Reg

C#压缩文件夹至zip,不包含所选文件夹【转+修改】

转自园友:jimcsharp的博文C#实现Zip压缩解压实例[转] 在此基础上,对其中的压缩文件夹方法略作修正,并增加是否对父文件夹进行压缩的方法.(因为笔者有只压缩文件夹下的所有文件,却不想将选中的文件夹打入压缩文件的需求),话不多说,上代码:其中需要依赖ICSharpCode.SharpZipLib.dll: 之后,新建一个类,代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst

Java使用线程池递归压缩文件夹下面的所有子文件

本文将介绍Java中利用线程池递归的方式压缩文件夹下面的所有子文件,具体方法如下: Gzip单个文件压缩 对于单个文件使用GZip压缩. package date0805.demo1; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream

C#利用SharpZipLib解压或压缩文件夹实例操作

最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享. 这里主要解决文件夹包含文件夹的解压缩问题. )下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边

Windows下Java File对象创建文件夹时的一个"坑"

import java.io.File; import java.io.IOException; public class DirCreate { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub String dirStr="D:"; File dir=new File(dirStr); System.out.println("====