2009-07-06 7 views
138

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

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

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

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

ответ

238

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

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

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

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

+3

Просто ссылка на DOCO: http://www.ruby-doc.org/core/classes/File.html#M002555 – Nippysaurus

+110

Зачем даже вкладывать его в другой метод? Просто позвоните прямо! –

+9

@ Radar Я понял, что метод урезания, вероятно, упрощен для целей вопроса и что фактический метод может содержать некоторую дополнительную логику. Если никакая другая логика не должна идти в методе, я соглашаюсь. Во что бы то ни стало, просто запустите каталог? непосредственно. – Emily

15
File.exist?("directory") 

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

Dir["directory"].empty? 

, которая будет возвращать true, если не был найден.

32

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

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

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

Dir.exist?('Directory Name') 

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

+2

Кажется, это требует Ruby> 1.9 или около того, на 1.8 он возвращает 'undefined method \' exists? ' для Dir: Class (NoMethodError) '.Кроме того, форма множественного числа теперь устарела, вместо этого используйте '.exist ?'. –

5

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

test ?d, 'some directory' 
+1

Престижность для этого. Не имел представления. Очень полезно, спасибо! – dimitarvp

+0

Это аккуратно. Не самый непосредственный _expressive_, но аккуратный. –

Смежные вопросы