Этот ответ не точен. FILE - это «относительный» путь к файлу из текущего каталога выполнения, а не абсолютный. Вы должны использовать File.expand_path ( FILE ), чтобы получить абсолютный путь
Люк Байес,
7
Двойные подчеркивания были автоматически удалены в комментарии выше.
Люк Байес
1
это все еще верно в ruby 1.9.2?
Zasz
4
@Zasz В 1.9.2 все работает иначе. Первоначально загруженный файл имеет относительный __FILE__, но другие включенные / обязательные файлы имеют абсолютные пути.
Джефф
9
@LukeBayes Вы можете сохранить подчеркивания и другие специальные символы в комментариях переполнения стека, обрамляя текст в конце с помощью обратных галочек. Пишите, `__FILE__`чтобы получить __FILE__.
Рори О'Кейн
62
Значение __FILE__- это относительный путь, который создается и сохраняется (но никогда не обновляется) при загрузке вашего файла. Это означает, что если у вас есть какие-либо вызовы в Dir.chdirдругом месте вашего приложения, этот путь будет расширяться неправильно.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Одним из способов решения этой проблемы является сохранение расширенного значения __FILE__вне любого кода приложения. Пока ваши requireутверждения находятся в верхней части ваших определений (или, по крайней мере, перед любыми вызовами Dir.chdir), это значение будет продолжать использоваться после смены каталогов.
$MY_FILE_PATH =File.expand_path(File.dirname(__FILE__))# open class and do some stuff that changes directory
puts $MY_FILE_PATH
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.Путь расширился правильно по моему тесту. Моя версия ruby 2.3.7, возможно, более новая версия ruby исправила эту проблему.
Alec.Zhou
28
__FILE__ это имя файла с расширением файла, содержащего исполняемый код.
В foo.rb, __FILE__будет "foo.rb".
Если бы foo.rbбыли в режиссере, /home/joshто File.dirname(__FILE__)вернулись бы /home/josh.
В Ruby, версия для Windows в любом случае, я только что проверил и __FILE__не содержит полный путь к файлу. Вместо этого он содержит путь к файлу относительно того, откуда он выполняется.
В PHP __FILE__это полный путь (который на мой взгляд предпочтительнее). Вот почему, чтобы сделать ваши пути переносимыми в Ruby, вам действительно нужно использовать это:
Вам нужно добавить косую черту к вашему относительному пути:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Феликс Рабе
3
Вы никогда не должны жестко кодировать разделитель каталогов. Вместо этого используйте File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Ответы:
Это ссылка на текущее имя файла. В файле
foo.rb
,__FILE__
будет интерпретироваться как"foo.rb"
.Изменить: Ruby 1.9.2 и 1.9.3, похоже, ведут себя немного иначе, чем то, что сказал Люк Байес в своем комментарии . С этими файлами:
Бег
ruby test.rb
будет выводитьисточник
`__FILE__`
чтобы получить__FILE__
.Значение
__FILE__
- это относительный путь, который создается и сохраняется (но никогда не обновляется) при загрузке вашего файла. Это означает, что если у вас есть какие-либо вызовы вDir.chdir
другом месте вашего приложения, этот путь будет расширяться неправильно.Одним из способов решения этой проблемы является сохранение расширенного значения
__FILE__
вне любого кода приложения. Пока вашиrequire
утверждения находятся в верхней части ваших определений (или, по крайней мере, перед любыми вызовамиDir.chdir
), это значение будет продолжать использоваться после смены каталогов.источник
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
Путь расширился правильно по моему тесту. Моя версия ruby 2.3.7, возможно, более новая версия ruby исправила эту проблему.__FILE__
это имя файла с расширением файла, содержащего исполняемый код.В
foo.rb
,__FILE__
будет "foo.rb".Если бы
foo.rb
были в режиссере,/home/josh
тоFile.dirname(__FILE__)
вернулись бы/home/josh
.источник
В Ruby, версия для Windows в любом случае, я только что проверил и
__FILE__
не содержит полный путь к файлу. Вместо этого он содержит путь к файлу относительно того, откуда он выполняется.В PHP
__FILE__
это полный путь (который на мой взгляд предпочтительнее). Вот почему, чтобы сделать ваши пути переносимыми в Ruby, вам действительно нужно использовать это:Я должен отметить, что в Ruby 1.9.1
__FILE__
содержится полный путь к файлу, приведенное выше описание было для того, когда я использовал Ruby 1.8.7.Для совместимости с Ruby 1.8.7 и 1.9.1 (не уверен насчет 1.9) вам потребуются файлы с использованием конструкции, которую я показал выше.
источник
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )