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

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

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

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

Что я делаю неправильно?

Ответы на вопрос(5)

Все остальные ответы являются правильными, однако у вас могут возникнуть проблемы, если вы пытаетесь проверить каталог в домашнем каталоге пользователя. Убедитесь, что вы расширили относительный путь перед проверкой:

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
Решение Вопроса

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

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

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

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

 11 июн. 2014 г., 10:54
Wouldn & APOS; тDir.exists? не будь чищеFile.directory??
 06 июл. 2009 г., 11:48
Зачем даже помещать его в другой метод? Просто позвоните прямо!
 03 мая 2015 г., 19:08
@burningpony мои плохие, этоDir.exist?
 07 июл. 2009 г., 16:41
@Radar Я подумал, что упрощенный метод, вероятно, был упрощен для цели вопроса и что фактический метод может содержать некоторую дополнительную логику. Если никакая другая логика не должна идти в методе, я согласен. Конечно, просто запустить каталог? непосредственно.
 03 мая 2015 г., 19:03
File.exist?("directory")

Dir[] возвращает массив, поэтому он никогда не будетnil, Если вы хотите сделать это по-своему, вы могли бы сделать

Dir["directory"].empty?

который вернетсяtrue если оноwasn't найденный.

Вы могли бы использоватьKernel#test:

test ?d, 'some directory'

он получает его происхождение отhttps://ss64.com/bash/test.html вы заметите Башtest имеет этот флаг-d проверить, существует ли каталог -d file True if file is a Directory. [[ -d demofile ]]

 22 сент. 2016 г., 00:06
Это аккуратно. Не самый сразуexpressive, но аккуратно.
 22 июн. 2015 г., 13:12
Слава за это. Не имел представления. Очень полезно, спасибо!

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

Dir.exist?('Directory Name')

Returns true if the 'Directory Name' is a directory, false otherwise.1

 22 окт. 2015 г., 11:09
Это требует Ruby & gt; 1.9 или около того, на 1.8 возвращаетсяundefined method `exists?' for Dir:Class (NoMethodError), Кроме того, форма множественного числа теперь устарела, используйте.exist? вместо.

Ваш ответ на вопрос