Як перевірити, чи існує каталог / файл / символічне посилання за допомогою однієї команди в Ruby


83

Чи існує єдиний спосіб виявлення каталогу / файлу / символічного посилання / тощо. сутність (більш узагальнена) існує?

Мені потрібна одна функція, оскільки мені потрібно перевірити масив шляхів, які можуть бути каталогами, файлами або символьними посиланнями. Я знаю, що File.exists?"file_path"працює для каталогів та файлів, але не для символьних посилань (що є File.symlink?"symlink_path").


1
Яку версію Ruby ви використовуєте? File.exist? працює для символічних посилань для мене в Ruby 1.9.2 в OS X 10.6.6

1
Щоб пояснити: для символьних посилань ви просите щось, що повертається, trueякщо символічне посилання існує, незалежно від того, чи може воно в кінцевому підсумку бути вирішене на несимвольне посилання. Тобто він повинен повертатись і trueдля непрацюючих посилань. File.exists?повернеться лише trueдля символічного посилання, яке не порушено.
Келвін

Відповіді:


147

У стандартному модулі File доступні звичайні тести файлів :

RUBY_VERSION # => "1.9.2"
bashrc = ENV['HOME'] + '/.bashrc'
File.exist?(bashrc) # => true
File.file?(bashrc)  # => true
File.directory?(bashrc) # => false

Ви там зможете знайти те, що хочете.


ОП: "Дякую, але мені потрібні всі три істинні чи хибні"

Очевидно, ні. Гаразд, спробуйте щось на зразок:

def file_dir_or_symlink_exists?(path_to_file)
  File.exist?(path_to_file) || File.symlink?(path_to_file)
end

file_dir_or_symlink_exists?(bashrc)                            # => true
file_dir_or_symlink_exists?('/Users')                          # => true
file_dir_or_symlink_exists?('/usr/bin/ruby')                   # => true
file_dir_or_symlink_exists?('some/bogus/path/to/a/black/hole') # => false

1
Я б радив не робити конкатенацію необроблених рядків ( ENV['HOME'] + '/.bashrc'), яка може не працювати на різних платформах. Ви повинні використовувати об'єднання файлів Ruby, а також чому б не почати з того, Rails.rootякщо ви використовуєте Rails. File.exists?(Rails.root.join('db', 'my_seeds.csv')
Кирило Дюшон-Доріс

2
Це гарантовано не буде працювати на різних платформах, оскільки Windows не знає про Bash і, отже, про .bashrc. Але це могло б працювати на платформі * nix. Однак використання /не є проблемою, оскільки введення-виведення Ruby автоматично перетворює з косих косих косих рисок у зворотні слеші в Windows .
Олов'яна людина,

Може бути , це було правдою в грудні 2016 року, але Windows , безумовно , робить знати про Bash в ці дні. :-) Я можу ввести bashв меню "Пуск" і у вікні консолі, що cat ~/.bashrcвиходить , видасть вихідні дані. ¯ \ _ (ツ) _ / ¯
Джонатан Гілберт

Відповідь Кирила, на жаль, не зовсім правильна - конкатенація рядків ПРАЦЮЄ у вікнах для "File.exist?" перевіряє, на що вже вказував Олова. Я додав цей коментар тут лише для підтвердження.
shevy

14

Чому б не визначити власну функцію File.exists?(path) or File.symlink?(path)та не використовувати її?


2
@Clawsy Я думаю, ти втрачаєш думку Гінтаутаса: ти програміст - якщо потрібна функція не існує, ти можеш її створити.
Телемах

4
Навіщо винаходити колесо, коли воно вже є частиною мови?
The Tin Man

11
Я вважаю дуже корисним не надто захоплюватися деталями в програмуванні. Якщо ви знаєте простий і простий спосіб вирішити проблему, просто зробіть це. Якщо через якийсь час ви знайдете кращий спосіб, ви завжди можете повернутися і виправити. Визначення нової функції у цій ситуації є нерозбірливим.
Gintautas Miliauskas

5
Але функціонал вже вбудований у мову і простий у використанні. Потім стає випадком читання, щоб побачити, що доступно, і додавання дзвінка. Написання коду для реалізації функціональності, яка вже існує, лише тому, що ви не знайшли час прочитати RDoc, який поставляється з мовою ... просто не додається мені. За цією логікою ви могли б переписати стандартну бібліотеку.
Олов'яна людина,

2
Використовувати File.exist? замість File.exists? оскільки це застаріло в ruby ​​2.2.0: ruby-doc.org/core-2.2.0/File.html#method-c-exists-3F
atw
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.