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


163

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

由于某些原因,我的代码无法正常工作,即使它为false ,也始终返回true

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

我究竟做错了什么?

Answers:


287

如果您要查找的文件是目录而不是文件,这很重要,则可以使用File.directory?Dir.exist?。仅当文件存在且为目录时,此方法才返回true。

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

def directory_exists?(directory)
  File.directory?(directory)
end

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


139
为什么还要把它放在另一个方法里呢?只需直接调用即可!
Ryan Bigg

11
@Radar我认为简化的方法可能会针对问题进行简化,并且实际方法可能包含一些其他逻辑。如果方法中不需要其他逻辑,则表示同意。一定要运行目录吗?直。
艾米丽(Emily)2009年

4
会不会Dir.exists?比这更清洁File.directory?
Yo Ludke 2014年

3
Dir.exists?已弃用,使用Dir.exist
fkoessler

4
@burningpony,我不好,是Dir.exist?
fkoessler 2015年

42

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

Dir.exist?('Directory Name')

返回true“目录名称”是否为目录,false否则返回。1个


2
这似乎需要Ruby> 1.9左右,在1.8上它会返回undefined method `exists?' for Dir:Class (NoMethodError)。另外,现在不建议使用复数形式,.exist?而应使用。
Josip Rodin 2015年

40

所有其他答案都是正确的,但是,如果您要检查用户主目录中的目录,则可能会遇到问题。在检查之前,请确保您展开了相对路径:

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

18
File.exist?("directory")

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

Dir["directory"].empty?

这将返回true如果它没有被发现。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.