Esta resposta não é precisa. FILE é o caminho "relativo" para o arquivo do diretório de execução atual - não absoluto. Você deve usar File.expand_path ( ARQUIVO ) para obter o caminho absoluto
Luke Bayes
7
Os sublinhados duplos foram removidos automaticamente no comentário acima.
Luke Bayes
1
isso ainda é verdade no ruby 1.9.2?
Zasz
4
@Zasz Funciona meio diferente no 1.9.2. O arquivo carregado inicialmente possui um __FILE__ relativo, mas outros arquivos incluídos / necessários têm caminhos absolutos.
Geoff
9
@LukeBayes Você pode preservar sublinhados e outros caracteres especiais nos comentários do Stack Overflow cercando o texto literal com reticulares. Escreva `__FILE__`para receber __FILE__.
Rory O'Kane
62
O valor de __FILE__é um caminho relativo que é criado e armazenado (mas nunca atualizado) quando o arquivo é carregado. Isso significa que, se você tiver chamadas para Dir.chdirqualquer outro lugar no seu aplicativo, esse caminho será expandido incorretamente.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Uma solução alternativa para esse problema é armazenar o valor expandido de __FILE__fora de qualquer código de aplicativo. Desde que suas requireinstruções estejam no topo de suas definições (ou pelo menos antes de qualquer chamada para Dir.chdir), esse valor continuará sendo útil após a alteração de diretórios.
$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.O caminho foi expandido corretamente no meu teste. Minha versão do ruby é 2.3.7, talvez a versão mais recente do ruby tenha corrigido esse problema.
Alec.Zhou
28
__FILE__ é o nome do arquivo com extensão do arquivo que contém o código que está sendo executado.
In foo.rb,__FILE__ seria "foo.rb".
Se foo.rbestivesse no dir /home/josh, File.dirname(__FILE__)retornaria /home/josh.
De qualquer forma, no Ruby, a versão do Windows, acabei de verificar e __FILE__não contém o caminho completo para o arquivo. Em vez disso, contém o caminho para o arquivo em relação ao local de execução.
Em PHP __FILE__é o caminho completo (que na minha opinião é preferível). É por isso que, para tornar seus caminhos portáteis em Ruby, você realmente precisa usar isso:
Você precisa prefixar uma barra para o seu caminho relativo:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Você nunca deve codificar o separador de diretório. Use File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Respostas:
É uma referência ao nome do arquivo atual. No arquivo
foo.rb
,__FILE__
seria interpretado como"foo.rb"
.Edit: Ruby 1.9.2 e 1.9.3 parecem se comportar um pouco diferente do que Luke Bayes disse em seu comentário . Com esses arquivos:
A execução
ruby test.rb
produziráfonte
`__FILE__`
para receber__FILE__
.O valor de
__FILE__
é um caminho relativo que é criado e armazenado (mas nunca atualizado) quando o arquivo é carregado. Isso significa que, se você tiver chamadas paraDir.chdir
qualquer outro lugar no seu aplicativo, esse caminho será expandido incorretamente.Uma solução alternativa para esse problema é armazenar o valor expandido de
__FILE__
fora de qualquer código de aplicativo. Desde que suasrequire
instruções estejam no topo de suas definições (ou pelo menos antes de qualquer chamada paraDir.chdir
), esse valor continuará sendo útil após a alteração de diretórios.fonte
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
O caminho foi expandido corretamente no meu teste. Minha versão do ruby é 2.3.7, talvez a versão mais recente do ruby tenha corrigido esse problema.__FILE__
é o nome do arquivo com extensão do arquivo que contém o código que está sendo executado.In
foo.rb
,__FILE__
seria "foo.rb".Se
foo.rb
estivesse no dir/home/josh
,File.dirname(__FILE__)
retornaria/home/josh
.fonte
De qualquer forma, no Ruby, a versão do Windows, acabei de verificar e
__FILE__
não contém o caminho completo para o arquivo. Em vez disso, contém o caminho para o arquivo em relação ao local de execução.Em PHP
__FILE__
é o caminho completo (que na minha opinião é preferível). É por isso que, para tornar seus caminhos portáteis em Ruby, você realmente precisa usar isso:Devo observar que no Ruby 1.9.1
__FILE__
contém o caminho completo para o arquivo, a descrição acima era para quando usei o Ruby 1.8.7.Para ser compatível com o Ruby 1.8.7 e 1.9.1 (não tenho certeza sobre o 1.9), você deve solicitar arquivos usando a construção mostrada acima.
fonte
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )