Как проверить, существует ли данный каталог в Ruby

163

Я пытаюсь написать скрипт, который автоматически проверяет или обновляет URL Subversion в зависимости от того, существует ли указанный каталог или нет.

По какой-то причине мой код не работает и всегда возвращает true, даже если это false:

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

Что я делаю не так?

ясень
источник

Ответы:

287

Если имеет значение, является ли файл, который вы ищете, каталогом, а не просто файлом, вы можете использовать File.directory?или Dir.exist?. Это вернет true, только если файл существует и является каталогом.

Кроме того, более идиоматическим способом написания метода будет использование того факта, что Ruby автоматически возвращает результат последнего выражения внутри метода. Таким образом, вы можете написать это так:

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

Обратите внимание, что использование метода не является необходимым в данном случае.

Эмили
источник
139
Зачем даже помещать его в другой метод? Просто позвоните прямо!
Райан Бигг
11
@Radar Я подумал, что упрощенный метод, вероятно, был упрощен для цели вопроса и что фактический метод может содержать некоторую дополнительную логику. Если никакая другая логика не должна идти в методе, я согласен. Конечно, просто запустить каталог? непосредственно.
Эмили
4
Не будет Dir.exists?ли чище, чем File.directory??
Йо Людке
3
Dir.exists?устарела, используйтеDir.exist
fkoessler
4
@burningpony мой плохой, этоDir.exist?
fkoessler
42

Вы также можете использовать Dir::exist?так:

Dir.exist?('Directory Name')

Возвращает, trueесли «Имя каталога» является каталогом, в falseпротивном случае. 1

ma11hew28
источник
2
Кажется, для этого требуется Ruby> 1,9 или около того, на 1,8 он возвращается undefined method `exists?' for Dir:Class (NoMethodError). Кроме того, форма множественного числа теперь устарела, используйте .exist?вместо этого.
Иосип Роден
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если он не был найден.

cloudhead
источник
7

Вы можете использовать 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 ]]

jtzero
источник
1
Это аккуратно. Не самый выразительный , но аккуратный.
kayleeFrye_onDeck