必须在Windows 7上运行ruby脚本并获得Permission denied EACCES

时间:2013-12-23 21:16:29

标签: ruby windows

我必须在Windows 7上运行ruby脚本(我知道这是个坏主意)。 我的脚本创建文件夹(如果它们不存在)并将文件复制到其中。 我正在使用FileUtils lib来执行这项工作,例如:

FileUtils.mkdir_p(path)
FileUtils.cp_r(file.path, path)
FileUtils.touch(file)

在ubuntu和mac上一切正常,但在Windows 7机器上我遇到了下一个错误:

Permission denied - ./program_folder/input/. (Errno::EACCES)

在这个代码行上:

Dir.entries('./program_folder/input').map { |file_name| File.new("./program_folder/input/#{file_name}") }.compact

任何想法我该如何解决?

我尝试使用管理员访问权限运行ruby和irb termianl并尝试在所有路径上执行FileUtils.chmod_R(0777,@ path)但仍然没有更改...

1 个答案:

答案 0 :(得分:1)

你的命令

Dir.entries('./program_folder/input').map { |file_name| 
  File.new("./program_folder/input/#{file_name}")
}.compact

尝试创建一个与之前读过的文件/文件夹同名的文件。

详细说明:

  1. Dir.entries('.')找到的第一个文件是实际目录(.)。
  2. "./program_folder/input/#{file_name}"./program_folder/input/.(现有目录)。
  3. 此目录路径应为新文件的路径。
  4. 使用File.new,您无法以文件形式打开目录。

  5. 评论后备注:

    在您调用Dir.entries的{​​{1}}内 - 创建文件句柄。没有模式,它会尝试打开现有文件(文件,而不是目录!)。 File.new是一个无法作为文件打开的目录。

    如果您只想要文件名,则不需要.,字符串File.new就足够了。 更好的解决方案是"./program_folder/input/#{file_name}"方法:

    File.join

    File.join("./program_folder/input", file_name)
    

    如果您需要真实文件名,可以查看目录:

    File.join(".", "program_folder", "input", file_name)
    

    或更好,您删除目录:

    Dir.entries('./program_folder/input').map { |file_name|
      "./program_folder/input/#{file_name}" unless File.directory?("./program_folder/input/#{file_name}")
    }.compact