#ruby #configuration-files
#ruby #конфигурация-файлы
Вопрос:
Как бы я, скажем, определил, существует ли файл ~/.my_proj_config
в какой-либо ОС на Ruby?
Ответ №1:
Вызов Dir.home — это независимый от операционной системы способ доступа к домашнему каталогу пользователя. Затем вы можете использовать его как
File.exists?(File.join(Dir.home, ".my_proj_config"))
Комментарии:
1. Какую версию ruby вы используете? Он определен в ruby-doc.org/core-1.9.3/Dir.html#method-c-home
Ответ №2:
Это работает в Ruby 1.9, но учтите, что в некоторых системах (например, Windows) требуется вызов expand_path
:
File.exists?( File.expand_path "~/.my_proj_config" )
Ответ №3:
Используйте класс File и его метод exist?
.
Ответ №4:
Взгляните на Pathname
класс, в частности на realpath
функцию — это даст вам полный (расширенный) путь к вашему файлу.
http://www.ruby-doc.org/stdlib/libdoc/pathname/rdoc/classes/Pathname.html#M001991
Затем вы используете File
класс вместе с exists?
методом, чтобы выяснить, существует ли это. Однако вам не нужно использовать realpath
, если вы используете этот метод.
Комментарии:
1. Мне было больше интересно, является ли ‘~’ приемлемым способом найти каталог пользователя из любой ОС?
2. О, извините, да, тильда имеет согласованное кроссплатформенное поведение, если вы используете 1.9. Смотрите Этот коммит в кодовой базе, который добавляет функциональность: redmine.ruby-lang.org/repositories/diff/ruby-19?rev=21312
3. Ваше утверждение, по-видимому, не соответствует действительности. В Windows, используя Ruby 1.9.2p180, я вижу:
File.exists?("~/tmp.rb")#=>false
ноFile.exists?(File.join(Dir.home,'tmp.rb'))#=>true
. Если вы вставитеFile.expand_path
, это сработает (смотрите Мой ответ).4. Путь#realpath не выполняет расширение в виде тильды (~). Фактически, во всем документе с именем пути нет ни одного экземпляра тильды, что разочаровывает, поскольку предполагается, что это новый awesome.