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

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

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

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

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


person Ash    schedule 06.07.2009    source источник


Ответы (5)


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

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

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

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

person Emily    schedule 06.07.2009
comment
Зачем вообще помещать его в другой метод? Просто позвоните прямо! - person Ryan Bigg; 06.07.2009
comment
@Radar Я подумал, что урезанный метод, вероятно, был упрощен для цели вопроса и что фактический метод может содержать некоторую дополнительную логику. Если в методе не требуется никакой другой логики, я согласен. Во что бы то ни стало, просто запустить каталог? напрямую. - person Emily; 07.07.2009
comment
Разве Dir.exists? не будет чище, чем File.directory?? - person Yo Ludke; 11.06.2014
comment
Dir.exists? устарел, используйте Dir.exist - person fkoessler; 21.04.2015
comment
@burningpony, плохо, это Dir.exist? - person fkoessler; 03.05.2015

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

Dir.exist?('Directory Name')

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

person ma11hew28    schedule 11.06.2013

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

File.exists? '~/exists'
=> false
File.directory? '~/exists'
=> false
File.exists? File.expand_path('~/exists')
=> true
person Andrew    schedule 31.10.2012

File.exist?("directory")

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

Dir["directory"].empty?

который вернет true, если он не найден.

person cloudhead    schedule 06.07.2009

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

person jtzero    schedule 24.07.2014
comment
Это аккуратно. Не очень сразу выразительно, но аккуратно. - person kayleeFrye_onDeck; 22.09.2016