Errno :: ENOENT:没有这样的文件或目录ruby
我收到以下错误:
"Errno::ENOENT: No such file or directory"
当我尝试将文件下载到不存在的目录时。
例如:
ftp = Net::FTP.new('example.com') ftp.login files = ftp.chdir('pub/lang/ruby/contrib') files = ftp.list('n*') ftp.getbinaryfile('nif.rb-0.91.gz', 'pub/lang/ruby/contrib/nif.gz', 1024) ftp.close
但是,对于我要下载的许多文件,完整的目录路径将不存在。 例如,在第一个文件创建pub之前,它将不存在,这也适用于lang / ruby / contrib。
有没有一种方法可以检查目录是否存在,如果不创建它们? 我知道存在?,但是它看起来引用文件并且它不会创建完整路径。 我想我需要一些递归方法来遍历文件夹结构,直到它命中文件名。
编辑:mkdir_p似乎正是我需要的解决方案。
但是,当我使用“/ a / b / c”路径时,我注意到FileUtils.mkdir_p(File.dirname(localdir))返回错误:Errno :: EACCES:权限被拒绝 – / a
如果我手动删除前面的“/”它可以工作。 是什么造成的? 解决错误的最佳解决方案是什么? 我应该使用以下内容吗?
path="/a/b/c" if path[0]="/" path=path[1..-1] end
但是,我觉得这只是一个黑客。
您无法保存到不存在的路径。 作为开发人员,您有责任在尝试保存文件之前确保目标路径存在。
Ruby有一些方法可以让你检查文件或目录是否存在:
- File.exist?( ‘路径/到/文件’)
- 的File.File?( ‘路径/到/文件’)
- File.directory?(‘path/to/file“)
- Dir.directory?(‘path/to/dir“)
- Dir.mkdir( ‘路径/到/ DIR’)
- FileUtils.makedirs( ‘路径/到/ DIR’)
mkpath
FileUtils.makedirs()
是mkpath
和mkdir_p
的别名。 我更喜欢makedirs
因为它是一个助记符。
这些也很有用:
- Dir.chdir( ‘路径/到/ DIR’)
- FileUtils.chdir( ‘路径/到/ DIR’)
在这两者之间,我更喜欢Dir.chdir
,因为它需要一个块。 该块内发生的任何操作都发生在您更改的目录中。 退出时,目录将恢复为之前的状态。
在fileutils模块中,您可以使用类似于mkdir -p
命令的mkdir_p
,如果该命令尚不存在,则创建完整路径。
模拟* nix mkdir -p,mkdir_p,是你需要的,这是在其他两个答案中提供的,但我没有看到任何人在你的编辑中解决权限问题。
解决方案是用户调用脚本需要对根目录具有写权限。
路径“/ a / b / c”正在寻址根路径(“/”)。 这通常只能由root用户或具有sudo访问权限的用户访问。
当您修改路径以删除前导“/”时,您告诉mkdir_p创建相对于当前工作目录而不是相对于根目录的目录“a / b / c”。 修改版本工作的原因是因为调用ruby脚本的用户对当前工作目录具有写权限。
另外,如果您的脚本的消费者提供路径输入,那么您可能不希望删除前导斜杠,因为这可以在与用户期望的完全不同的位置创建文件/目录…除非这是你的计划的目的,但事先清楚。
参考文献:
- * nix风格的权限
- 须藤