Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Errno::eNote:没有这样的文件或目录_Ruby - Fatal编程技术网

Ruby Errno::eNote:没有这样的文件或目录

Ruby Errno::eNote:没有这样的文件或目录,ruby,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.g

我得到以下错误:

"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

是否有一种方法可以检查目录是否存在,如果不存在,是否可以创建它们?我知道有exist?,但它会查找引用文件,而不会创建完整路径。我想我需要一些递归方法来遍历文件夹结构,直到它到达文件名

编辑: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

但是,我觉得这只是一种黑客行为。

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

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

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

FileUtils.makedirs()
mkpath
mkdir\u p
的别名。我更喜欢
makedirs
,因为它是一种助记符

这些措施也很有用:


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

类似于*nix mkdir-p,mkdir\u p,这是您所需要的,在其他两个答案中提供了,但我没有看到任何人解决您的编辑权限问题

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

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

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

另一方面,如果脚本的使用者提供路径输入,那么您可能不希望删除前导斜杠,因为它可能会在用户期望的位置创建文件/目录…除非这是您程序的目的,但请事先澄清

参考资料:


    • 我之所以来到这里,是因为我安装了gem,但计算机上没有安装该文件。在我的例子中,我安装了gem
      espeak ruby
      gem,但它没有安装在我的mac电脑上,因此我使用simple
      brew install espeak
      命令安装了它,并重新启动了服务器。我建议你让我们确保一切都安装正确