Cette réponse n'est pas exacte. FILE est le chemin "relatif" du fichier à partir du répertoire d'exécution actuel - non absolu. Vous devez utiliser File.expand_path ( FILE ) pour obtenir le chemin absolu
Luke Bayes
7
Les doubles soulignements ont été automatiquement supprimés dans le commentaire ci-dessus.
Luke Bayes
1
est-ce toujours vrai dans ruby 1.9.2?
Zasz
4
@Zasz Cela fonctionne un peu différemment en 1.9.2. Le fichier initialement chargé a un __FILE__ relatif, mais les autres fichiers inclus / requis ont des chemins absolus.
Geoff
9
@LukeBayes Vous pouvez conserver les traits de soulignement et autres caractères spéciaux dans les commentaires Stack Overflow en entourant le texte littéral avec des astuces. Écrivez `__FILE__`pour obtenir __FILE__.
Rory O'Kane
62
La valeur de __FILE__est un chemin relatif qui est créé et stocké (mais jamais mis à jour) lorsque votre fichier est chargé. Cela signifie que si vous avez des appels vers Dir.chdirun autre endroit de votre application, ce chemin d'accès ne se développera pas correctement.
puts __FILE__
Dir.chdir '../../'
puts __FILE__
Une solution de contournement à ce problème consiste à stocker la valeur étendue de l' __FILE__extérieur de tout code d'application. Tant que vos requireinstructions sont en haut de vos définitions (ou au moins avant tout appel à Dir.chdir), cette valeur continuera d'être utile après avoir changé de répertoire.
$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.Le chemin s'est correctement développé sous mon test. Ma version rubis est 2.3.7, peut-être que la nouvelle version rubis a résolu ce problème.
Alec.Zhou
28
__FILE__ est le nom de fichier avec l'extension du fichier contenant le code en cours d'exécution.
Dans foo.rb, __FILE__serait "foo.rb".
Si se foo.rbtrouvaient dans le répertoire /home/joshpuis File.dirname(__FILE__)reviendrait /home/josh.
Dans Ruby, la version Windows de toute façon, je viens de vérifier et __FILE__ne contient pas le chemin d'accès complet au fichier. Au lieu de cela, il contient le chemin d'accès au fichier par rapport à son emplacement d'exécution.
En PHP, __FILE__c'est le chemin complet (qui à mon avis est préférable). C'est pourquoi, pour rendre vos chemins portables dans Ruby, vous devez vraiment utiliser ceci:
Je dois noter que dans Ruby 1.9.1 __FILE__contient le chemin d'accès complet au fichier, la description ci-dessus était pour quand j'ai utilisé Ruby 1.8.7.
Afin d'être compatible avec Ruby 1.8.7 et 1.9.1 (pas sûr de 1.9), vous devez avoir besoin de fichiers en utilisant la construction que j'ai montrée ci-dessus.
Vous devez ajouter une barre oblique à votre chemin relatif:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe
3
Vous ne devez jamais coder en dur le séparateur de répertoire. Utilisez plutôt File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Réponses:
Il s'agit d'une référence au nom de fichier actuel. Dans le fichier
foo.rb
,__FILE__
serait interprété comme"foo.rb"
.Edit: Ruby 1.9.2 et 1.9.3 semblent se comporter un peu différemment de ce que Luke Bayes a dit dans son commentaire . Avec ces fichiers:
La course
ruby test.rb
produirala source
`__FILE__`
pour obtenir__FILE__
.La valeur de
__FILE__
est un chemin relatif qui est créé et stocké (mais jamais mis à jour) lorsque votre fichier est chargé. Cela signifie que si vous avez des appels versDir.chdir
un autre endroit de votre application, ce chemin d'accès ne se développera pas correctement.Une solution de contournement à ce problème consiste à stocker la valeur étendue de l'
__FILE__
extérieur de tout code d'application. Tant que vosrequire
instructions sont en haut de vos définitions (ou au moins avant tout appel àDir.chdir
), cette valeur continuera d'être utile après avoir changé de répertoire.la source
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
Le chemin s'est correctement développé sous mon test. Ma version rubis est 2.3.7, peut-être que la nouvelle version rubis a résolu ce problème.__FILE__
est le nom de fichier avec l'extension du fichier contenant le code en cours d'exécution.Dans
foo.rb
,__FILE__
serait "foo.rb".Si se
foo.rb
trouvaient dans le répertoire/home/josh
puisFile.dirname(__FILE__)
reviendrait/home/josh
.la source
Dans Ruby, la version Windows de toute façon, je viens de vérifier et
__FILE__
ne contient pas le chemin d'accès complet au fichier. Au lieu de cela, il contient le chemin d'accès au fichier par rapport à son emplacement d'exécution.En PHP,
__FILE__
c'est le chemin complet (qui à mon avis est préférable). C'est pourquoi, pour rendre vos chemins portables dans Ruby, vous devez vraiment utiliser ceci:Je dois noter que dans Ruby 1.9.1
__FILE__
contient le chemin d'accès complet au fichier, la description ci-dessus était pour quand j'ai utilisé Ruby 1.8.7.Afin d'être compatible avec Ruby 1.8.7 et 1.9.1 (pas sûr de 1.9), vous devez avoir besoin de fichiers en utilisant la construction que j'ai montrée ci-dessus.
la source
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )