我必须在Windows 7上运行ruby脚本(我知道这是不好的主意)。 我的脚本创build文件夹(如果它们不存在)并将文件复制到它们中。 我正在使用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)
在这个codeline上:
Dir.entries('./program_folder/input').map { |file_name| File.new("./program_folder/input/#{file_name}") }.compact
任何想法如何修复它?
我试图运行pipe理员访问ruby和irb termianl,并试图做所有pathFileUtils.chmod_R(0777,@path),但仍然没有改变…
你的命令
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
调用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
或更好的,你删除目录:
Dir.entries('.').delete_if{|file_name| File.directory?(file_name) }