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

186

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

出于某种原因,我的代码无法正常工作,并且始终返回true,即使它是false

def directory_exists?(directory)
  return false if Dir[directory] == nil
  true
end

我做错了什么?

5个回答

320
如果你需要确定你要找的文件是一个 目录 而不仅仅是一个文件,你可以使用 File.directory?Dir.exist?。这将仅在文件存在且为目录时返回 true。
附带一提,更习惯用法的方法是利用 Ruby 自动返回方法内最后一个表达式的结果。因此,你可以像下面这样编写它:
def directory_exists?(directory)
  File.directory?(directory)
end

请注意,在当前情况下不需要使用一种方法。


157
为什么要把它放在另一个方法里?直接调用它不就好了! - Ryan Bigg
11
@Radar 我认为简化的方法可能是为了问题而简化的,实际方法可能包含一些额外的逻辑。如果该方法不需要其他逻辑,我同意。尽管直接运行directory?。 - Emily
5
Dir.exists? 是否比 File.directory? 更加简洁明了? - Yo Ludke
4
Dir.exists? 已经被弃用,请使用 Dir.exist - fkoessler
7
@burningpony 不好意思,应该是 Dir.exist? - fkoessler

50

您也可以使用Dir::exist?,如下所示:

Dir.exist?('Directory Name')

如果“目录名称”是目录,则返回true,否则返回false1


48

其他回答都是正确的,但是如果你尝试在用户的主目录中检查目录,可能会遇到问题。确保在检查之前扩展相对路径:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true

19
File.exist?("directory")

Dir[] 返回一个数组,因此它永远不会是 nil。如果你想要按照自己的方式做,可以这样做:

Dir["directory"].empty?

如果找不到,将返回true


7
你可以使用 Kernel#test 方法:
test ?d, 'some directory'

IT技术起源于https://ss64.com/bash/test.html。你会注意到Bash test有一个标志-d,用于测试目录是否存在。-d file 如果file是一个目录,则为True。[[ -d demofile ]]


1
这很整洁。虽然不是最直观的表达方式,但很整洁。 - kayleeFrye_onDeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接