Esta respuesta no es precisa. ARCHIVO es la ruta "relativa" al archivo desde el directorio de ejecución actual, no absoluto. Debe usar File.expand_path ( FILE ) para obtener la ruta absoluta
Luke Bayes
77
Los guiones bajos dobles se eliminaron automáticamente dentro del comentario anterior.
Luke Bayes
1
¿sigue siendo cierto en ruby 1.9.2?
Zasz
44
@Zasz Funciona un poco diferente en 1.9.2. El archivo cargado inicialmente tiene un __FILE__ relativo, pero otros archivos incluidos / requeridos tienen rutas absolutas.
Geoff
99
@LukeBayes Puede preservar los guiones bajos y otros caracteres especiales en los comentarios de Desbordamiento de pila rodeando el texto literal con comillas invertidas. Escribe `__FILE__`para obtener __FILE__.
Rory O'Kane
62
El valor de __FILE__es una ruta relativa que se crea y almacena (pero nunca se actualiza) cuando se carga el archivo. Esto significa que si tiene alguna llamada a Dir.chdircualquier otro lugar de su aplicación, esta ruta se expandirá incorrectamente.
puts __FILE__Dir.chdir '../../'
puts __FILE__
Una solución a este problema es almacenar el valor expandido __FILE__fuera de cualquier código de aplicación. Mientras sus requiredeclaraciones estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada a Dir.chdir), este valor continuará siendo útil después de cambiar los directorios.
$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.El camino se expandió correctamente bajo mi prueba. Mi versión ruby es 2.3.7, tal vez la versión ruby más nueva solucionó este problema.
Alec.Zhou
28
__FILE__ es el nombre del archivo con la extensión del archivo que contiene el código que se está ejecutando.
En foo.rb, __FILE__sería "foo.rb".
Si foo.rbestaban en el dir /home/joshentonces File.dirname(__FILE__)volvería /home/josh.
En Ruby, la versión de Windows de todos modos, acabo de comprobar y __FILE__no contiene la ruta completa al archivo. En su lugar, contiene la ruta al archivo en relación con el lugar desde donde se ejecuta.
En PHP __FILE__es la ruta completa (que en mi opinión es preferible). Esta es la razón por la cual, para hacer que sus caminos sean portátiles en Ruby, realmente necesita usar esto:
Debo señalar que en Ruby 1.9.1 __FILE__contiene la ruta completa al archivo, la descripción anterior fue para cuando utilicé Ruby 1.8.7.
Para ser compatible con Ruby 1.8.7 y 1.9.1 (no estoy seguro acerca de 1.9), debe requerir archivos utilizando la construcción que mostré anteriormente.
Debe anteponer un corte a su camino relativo:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Nunca debe codificar el separador de directorio. Utilice File.join en su lugar: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Respuestas:
Es una referencia al nombre del archivo actual. En el archivo
foo.rb
,__FILE__
se interpretaría como"foo.rb"
.Editar: Ruby 1.9.2 y 1.9.3 parecen comportarse un poco diferente de lo que dijo Luke Bayes en su comentario . Con estos archivos:
La ejecución
ruby test.rb
dará salidafuente
`__FILE__`
para obtener__FILE__
.El valor de
__FILE__
es una ruta relativa que se crea y almacena (pero nunca se actualiza) cuando se carga el archivo. Esto significa que si tiene alguna llamada aDir.chdir
cualquier otro lugar de su aplicación, esta ruta se expandirá incorrectamente.Una solución a este problema es almacenar el valor expandido
__FILE__
fuera de cualquier código de aplicación. Mientras susrequire
declaraciones estén en la parte superior de sus definiciones (o al menos antes de cualquier llamada aDir.chdir
), este valor continuará siendo útil después de cambiar los directorios.fuente
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
El camino se expandió correctamente bajo mi prueba. Mi versión ruby es 2.3.7, tal vez la versión ruby más nueva solucionó este problema.__FILE__
es el nombre del archivo con la extensión del archivo que contiene el código que se está ejecutando.En
foo.rb
,__FILE__
sería "foo.rb".Si
foo.rb
estaban en el dir/home/josh
entoncesFile.dirname(__FILE__)
volvería/home/josh
.fuente
En Ruby, la versión de Windows de todos modos, acabo de comprobar y
__FILE__
no contiene la ruta completa al archivo. En su lugar, contiene la ruta al archivo en relación con el lugar desde donde se ejecuta.En PHP
__FILE__
es la ruta completa (que en mi opinión es preferible). Esta es la razón por la cual, para hacer que sus caminos sean portátiles en Ruby, realmente necesita usar esto:Debo señalar que en Ruby 1.9.1
__FILE__
contiene la ruta completa al archivo, la descripción anterior fue para cuando utilicé Ruby 1.8.7.Para ser compatible con Ruby 1.8.7 y 1.9.1 (no estoy seguro acerca de 1.9), debe requerir archivos utilizando la construcción que mostré anteriormente.
fuente
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )