如何检查Ruby中是否存在给定目录

Ash*_*Ash 155 ruby

我正在尝试编写一个脚本,根据指定的目录是否存在自动检出或更新Subversion URL.

出于某种原因,我的代码不起作用,即使它是假的,总是返回true:

def directory_exists?(directory)
  return false if Dir[directory] == nil
  true
end
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Emi*_*ily 277

如果您要查找的文件是目录而不仅仅是文件,那么您可以使用File.directory?Dir.exist?.仅当文件存在且目录为时,才会返回true.

顺便说一下,编写该方法的更惯用的方法是利用Ruby自动返回方法中最后一个表达式的结果这一事实.因此,您可以像这样写:

def directory_exists?(directory)
  File.directory?(directory)
end
Run Code Online (Sandbox Code Playgroud)

注意,在当前情况下不需要使用方法.

  • 为什么要把它放在另一个方法中?直接打电话吧! (133认同)
  • @Radar我认为,为了问题的目的,可能简化了精简方法,并且实际方法可能包含一些额外的逻辑.如果方法中没有其他逻辑需要,我同意.无论如何,只需运行目录?直. (10认同)
  • 它是```Dir.exist?```http://ruby-doc.org/core-2.2.0/Dir.html#method-c-exist-3F (5认同)
  • "Dir.exists"不会比`File.directory更干净吗?`? (4认同)
  • @burningpony我的坏,这是'Dir.exist?` (4认同)
  • 只是链接到doco:http://www.ruby-doc.org/core/classes/File.html#M002555 (3认同)
  • `Dir.exists?`已被弃用,请使用`Dir.exist` (2认同)

ma1*_*w28 40

您也可以Dir::exist?这样使用:

Dir.exist?('Directory Name')
Run Code Online (Sandbox Code Playgroud)

true如果"目录名称"是目录,false则返回,否则返回.1

  • 这似乎需要Ruby> 1.9左右,在1.8上它返回`undefined method \`exists?' 对于Dir:Class(NoMethodError)`.此外,复数形式现在已弃用,请改用".exist". (2认同)

And*_*rew 37

所有其他答案都是正确的,但是,如果您尝试检查用户主目录中的目录,则可能会出现问题.确保在检查前扩展相对路径:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
Run Code Online (Sandbox Code Playgroud)


clo*_*ead 17

File.exist?("directory")
Run Code Online (Sandbox Code Playgroud)

Dir[]返回一个数组,所以永远不会nil.如果你想按自己的方式去做,你可以做到

Dir["directory"].empty?
Run Code Online (Sandbox Code Playgroud)

true如果没有找到它将返回.


jtz*_*ero 8

你可以使用Kernel#test:

test ?d, 'some directory'
Run Code Online (Sandbox Code Playgroud)

它来自https://ss64.com/bash/test.html 你会发现bash test有这个标志-d来测试一个目录是否存在 -d file True if file is a Directory. [[ -d demofile ]]

  • 为此感到荣幸.我不知道.非常有用,谢谢! (2认同)