22

我收到以下错误:

"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: Permission denied - /a

如果我手动删除前面的“/”,它就可以工作。这是什么原因造成的?解决错误的最佳解决方案是什么?我应该只使用以下内容吗?

 path="/a/b/c"
 if path[0]="/"
    path=path[1..-1]
 end

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

4

4 回答 4

20

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

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

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

这些也很有用:

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

于 2013-03-25T03:03:47.540 回答
4

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

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

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

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

就个人而言,如果您的脚本的使用者正在提供路径输入,那么您可能不想删除前导斜杠,因为这可能会在与用户期望的完全不同的位置创建文件/目录......除非那是你的程序的目的,但要事先明确。

参考:

于 2015-07-01T18:56:34.357 回答
2

我来到这里是因为我安装了 gem,但机器上没有安装该文件。就我而言,我安装了 gem espeak-rubygem,但它没有安装在我的 mac 上,所以我用简单brew install espeak的命令安装了它并重新启动了服务器。我给你的建议是我们确保一切都安装正确。

于 2019-10-29T02:58:01.657 回答
1

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

于 2013-03-25T00:19:33.963 回答