Проверка, существует ли файл в домашнем каталоге пользователя

#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 , если вы используете этот метод.

http://www.ruby-doc.org/core/classes/File.html#M000045

Комментарии:

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.