Как проверить, существует ли каталог/файл/символическая ссылка с помощью одной команды в Ruby

Есть ли единственный способ определить, является ли каталог/файл/символическая ссылка/и т. сущность (более обобщенная) существует?

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


person claudiut    schedule 04.02.2011    source источник
comment
Какую версию Руби вы используете? Файл существует? у меня работает для символических ссылок в Ruby 1.9.2 в OS X 10.6.6   -  person    schedule 04.02.2011
comment
Чтобы уточнить: для символических ссылок вы запрашиваете что-то, что возвращает true, если символическая ссылка существует, независимо от того, может ли она в конечном итоге быть преобразована в несимволическую ссылку. т.е. он также должен возвращать true для неработающих ссылок. File.exists? вернет true только для неповрежденной символической ссылки.   -  person Kelvin    schedule 19.05.2016


Ответы (2)


В стандартном модуле 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
person the Tin Man    schedule 04.02.2011
comment
Я бы посоветовал не выполнять конкатенацию необработанных строк (ENV['HOME'] + '/.bashrc'), которая может не работать на разных платформах. Вы должны использовать соединения файлов Ruby, а также почему бы не начать с Rails.root, если вы используете Rails. File.exists?(Rails.root.join('db', 'my_seeds.csv') - person Cyril Duchon-Doris; 15.12.2016
comment
Он гарантированно не будет работать на разных платформах, поскольку Windows не знает о Bash и, следовательно, о .bashrc. Но это будет работать на платформе * nix. Однако использование / не является проблемой, поскольку ввод-вывод Ruby автоматически преобразуется из прямого косая черта на обратную косую черту в Windows. - person the Tin Man; 15.12.2016
comment
Возможно, это было правдой в декабре 2016 года, но сегодня Windows определенно знает о Bash. :-) Я могу ввести bash в меню «Пуск», и в появившемся окне консоли cat ~/.bashrc выведет вывод. ¯\_(ツ)_/¯ - person Jonathan Gilbert; 24.07.2018
comment
Ответ Кирилла, к сожалению, не совсем правильный - конкатенация строк работает в Windows для File.exist? чеки, как уже указал Железный Дровосек. Я только добавил этот комментарий здесь, чтобы подтвердить это. - person shevy; 12.10.2018

Почему бы не определить свою собственную функцию File.exists?(path) or File.symlink?(path) и использовать ее?

person Gintautas Miliauskas    schedule 04.02.2011
comment
Конечно, я могу это сделать, но я хотел бы уже реализованный способ, который может проверить их обоих. Я имею в виду проверить, есть ли на этом пути «что-то». - person claudiut; 04.02.2011
comment
@Clawsy Я думаю, вы упускаете из виду точку зрения Гинтаутаса: вы программист - если нужной вам функции не существует, вы можете ее создать. - person Telemachus; 04.02.2011
comment
Нет, я не упускаю момент :). Я прекрасно понимаю. Я просто хочу добавить в свое приложение как можно меньше кода. В моем случае будет лучше (по вопросам разработки программного обеспечения), если я найду такой метод. Если нет, то... Я сделаю один, без проблем. Я просто хотел знать, есть ли предопределенный. Я не ленивый, это просто вставка кода в ОГРОМНОЕ приложение, о котором нужно очень хорошо позаботиться. Я просто хотел это знать... потому что не хочу повторяться. (СУХОЙ - Не повторяйтесь, из книги Pragmatic Programmer: D). - person claudiut; 04.02.2011
comment
Зачем изобретать велосипед, если он уже является частью языка? - person the Tin Man; 04.02.2011
comment
Я считаю очень полезным не слишком зацикливаться на деталях в программировании. Если вы знаете прямой и простой способ решить проблему, просто сделайте это. Если вы найдете лучший способ через некоторое время, вы всегда можете вернуться и исправить. В этой ситуации определение новой функции не составляет труда. - person Gintautas Miliauskas; 07.02.2011
comment
Но функциональность уже встроена в язык и проста в использовании. Затем это становится случаем чтения, чтобы увидеть, что доступно, и добавления вызова. Написание кода для реализации уже существующей функциональности только потому, что вы не нашли время, чтобы прочитать RDoc, который поставляется с языком ... просто не подходит мне. По этой логике вы можете в конечном итоге переписать стандартную библиотеку. - person the Tin Man; 08.02.2011
comment
Этот метод должен существовать где-то в ядре! Я буду продолжать искать его, пока он не появится волшебным образом, или до конца дней, в зависимости от того, что наступит раньше. Стоит сэкономить один дополнительный вызов метода. - person Jerome; 01.12.2013
comment
Использовать File.exist? вместо File.exists? поскольку это устарело в ruby ​​2.2.0: ruby-doc.org/core-2.2.0/File.html#method-c-exists-3F - person atw; 16.06.2016