Як перевірити, чи існує певний каталог у Ruby


163

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

Чомусь мій код не працює і завжди повертає справжнє, навіть якщо він помилковий:

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


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якщо його не було знайдено.


7

Ви можете використовувати Kernel#test:

test ?d, 'some directory'

це отримує його походження від https://ss64.com/bash/test.html ви помітите, що баш testмає цей прапор, -dщоб перевірити, чи існує каталог -d file True if file is a Directory. [[ -d demofile ]]


1
Це акуратно. Не самий відразу виразний , але акуратний.
kayleeFrye_onDeck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.