我必须在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)但仍然没有更改...
答案 0 :(得分:1)
你的命令
Dir.entries('./program_folder/input').map { |file_name|
File.new("./program_folder/input/#{file_name}")
}.compact
尝试创建一个与之前读过的文件/文件夹同名的文件。
详细说明:
Dir.entries('.')
找到的第一个文件是实际目录(.
)。"./program_folder/input/#{file_name}"
是./program_folder/input/.
(现有目录)。File.new
,您无法以文件形式打开目录。评论后备注:
在您调用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