【发布时间】:2010-11-08 06:50:20
【问题描述】:
我正在尝试编写一个脚本,该脚本会根据指定目录是否存在自动检出或更新 Subversion URL。
由于某种原因,我的代码无法正常工作,并且总是返回 true,即使它是 false:
def directory_exists?(directory)
return false if Dir[directory] == nil
true
end
我做错了什么?
【问题讨论】:
我正在尝试编写一个脚本,该脚本会根据指定目录是否存在自动检出或更新 Subversion URL。
由于某种原因,我的代码无法正常工作,并且总是返回 true,即使它是 false:
def directory_exists?(directory)
return false if Dir[directory] == nil
true
end
我做错了什么?
【问题讨论】:
你可以使用Kernel#test:
test ?d, 'some directory'
它来自https://ss64.com/bash/test.html
你会注意到 bash test 有这个标志 -d 来测试一个目录是否存在
-d file True if file is a Directory. [[ -d demofile ]]
【讨论】:
如果您要查找的文件是否是目录 而不仅仅是文件,则可以使用@987654321@ 或@987654322@。仅当文件存在并且是目录时才会返回 true。
顺便说一句,编写方法的一种更惯用的方法是利用 Ruby 自动返回方法内最后一个表达式的结果这一事实。因此,你可以这样写:
def directory_exists?(directory)
File.directory?(directory)
end
请注意,在当前情况下不需要使用方法。
【讨论】:
Dir.exists? 不会比File.directory? 干净吗?
Dir.exists? 已弃用,请使用 Dir.exist
Dir.exist?
【讨论】:
File.exist?("directory")
Dir[] 返回一个数组,所以它永远不会是nil。如果你想按照自己的方式做,你可以这样做
Dir["directory"].empty?
如果找不到,它将返回true。
【讨论】:
所有其他答案都是正确的,但是,如果您尝试检查用户主目录中的目录,则可能会遇到问题。确保在检查之前展开相对路径:
File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
【讨论】: