Errno :: ENOENT:没有这样的文件或目录ruby

时间:2013-03-25 00:16:27

标签: 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

然而,我觉得这只是一个黑客。

4 个答案:

答案 0 :(得分:15)

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

Ruby有一些方法可以让你检查文件或目录是否存在:

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

这些也很有用:

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

答案 1 :(得分:3)

* nix mkdir -p,mkdir_p的模拟,是你需要的,在其他两个答案中提供,但我没有看到任何人在你的编辑中解决权限。

解决方案是调用脚本的用户需要对根目录具有写权限。

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

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

另外,如果您的脚本的消费者提供路径输入,那么您可能不希望删除前导斜杠,因为这可以在与用户期望的完全不同的位置创建文件/目录...除非这是你的计划的目的,但要事先澄清。

参考文献:

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我到达这里是因为我安装了gem,但是该文件未安装在计算机上。就我而言,我安装了gem espeak-ruby gem,但未在我的mac上安装它,因此我使用简单的brew install espeak命令安装了gem,然后重新启动了服务器。我对您的建议是我们确保所有内容均已正确安装。

相关问题