必须在Windows 7上运行ruby脚本,并获得权限拒绝EACCES

我必须在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 

尝试创建一个与您之前读取的文件/文件夹名称相同的文件。

详细:

  1. Dir.entries('.')找到的第一个文件是实际的目录( . )。
  2. "./program_folder/input/#{file_name}"./program_folder/input/. (一个现有的目录)。
  3. 这个目录路径应该是新文件的路径。
  4. 使用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) }