2013-03-25 79 views
11

我收到以下错误:变量Errno :: ENOENT:没有这样的文件或目录红宝石

"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="https://stackoverflow.com/a/b/c" 
if path[0]="/" 
    path=path[1..-1] 
end 

但是,我觉得这只是一个破解。

回答

1

在fileutils模块中,您可以使用mkdir_p,与mkdir -p命令类似,如果该路径尚不存在,则该命令将创建完整路径。

9

您不能保存到不存在的路径。作为开发者,您有责任在尝试保存文件之前确保您的目标路径存在。

Ruby有,让你检查是否存在一个文件或目录的方法:

FileUtils.makedirs()mkpathmkdir_p的别名。我更喜欢makedirs,因为它是一个助记符。

这也将是有益的:

这两个我喜欢Dir.chdir之间,因为它需要一个块。该块内发生的任何操作都发生在您更改的目录中。在退出时,目录会恢复到之前的状态。

1

* nix mkdir -p,mkdir_p的模拟是您需要的,这是在另外两个答案中提供的,但是我没有看到任何人解决您关于权限的编辑问题。

解决方法是用户调用脚本需要在根目录下有写权限。

路径“/ a/b/c”寻址根路径(“/”)。这通常只能写入root用户或具有sudo访问权限的用户。

当您修改路径以删除前导“/”时,您告诉mkdir_p创建相对于当前工作目录而不是相对于根目录的目录“a/b/c”。修改版本的工作原因是因为用户调用ruby脚本具有对当前工作目录的写入权限。

作为个人而言,如果脚本消费者正在提供路径输入,那么您可能不想删除前导斜杠,因为它可以在与用户期望的地方截然不同的位置创建文件/目录。 。除非你的程序的目的是这样,但是要把它弄清楚。

参考文献:

相关问题