Ta odpowiedź nie jest dokładna. PLIK jest „względną” ścieżką do pliku z bieżącego katalogu wykonania - nie absolutną. Musisz użyć File.expand_path ( FILE ), aby uzyskać absolutną ścieżkę
Luke Bayes
7
Podwójne podkreślenia zostały automatycznie usunięte w powyższym komentarzu.
Luke Bayes
1
czy to wciąż prawda w Ruby 1.9.2?
Zasz
4
@Zasz Działa to trochę inaczej w 1.9.2. Początkowo załadowany plik ma względne __FILE__, ale inne dołączone / wymagane pliki mają bezwzględne ścieżki.
Geoff,
9
@LukeBayes Możesz zachować podkreślenia i inne znaki specjalne w komentarzach Przepełnienie stosu, otaczając dosłowny tekst odwrotnymi znakami. Napisz, `__FILE__`aby dostać __FILE__.
Rory O'Kane,
62
Wartością __FILE__jest ścieżka względna, która jest tworzona i przechowywana (ale nigdy nie aktualizowana) podczas ładowania pliku. Oznacza to, że jeśli masz jakieś połączenia z Dir.chdirdowolnym innym miejscem w aplikacji, ścieżka ta zostanie nieprawidłowo rozwinięta.
puts __FILE__Dir.chdir '../../'
puts __FILE__
Jednym z obejść tego problemu jest przechowywanie rozszerzonej wartości __FILE__poza dowolnym kodem aplikacji. Tak długo, jak twoje requireinstrukcje znajdują się na górze definicji (lub przynajmniej przed wywołaniami do Dir.chdir), ta wartość będzie nadal przydatna po zmianie katalogów.
$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.Ścieżka rozszerzyła się poprawnie podczas mojego testu. Moja wersja ruby to 2.3.7, być może nowsza wersja ruby naprawiła ten problem.
Alec.Zhou,
28
__FILE__ to nazwa pliku z rozszerzeniem pliku zawierającego wykonywany kod.
W foo.rb, __FILE__byłoby „foo.rb”.
Jeśli foo.rbbyły w reż /home/joshnastępnie File.dirname(__FILE__)wróci /home/josh.
W Ruby, wersja dla systemu Windows i tak, właśnie sprawdziłem i __FILE__nie zawiera pełnej ścieżki do pliku. Zamiast tego zawiera ścieżkę do pliku względem miejsca, z którego jest wykonywany.
W PHP __FILE__jest pełna ścieżka (która moim zdaniem jest lepsza). Dlatego, aby twoje ścieżki były przenośne w Rubim, naprawdę musisz użyć tego:
Powinienem zauważyć, że w Ruby 1.9.1 __FILE__zawiera pełną ścieżkę do pliku, powyższy opis dotyczył kiedy użyłem Ruby 1.8.7.
Aby być kompatybilnym zarówno z Ruby 1.8.7, jak i 1.9.1 (nie jestem pewien co do wersji 1.9), powinieneś wymagać plików za pomocą konstrukcji pokazanej powyżej.
Musisz dodać ukośnik do swojej ścieżki względnej:File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
Felix Rabe,
3
Nigdy nie należy na stałe kodować separatora katalogów. Zamiast tego użyj pliku File.join: File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )
Odpowiedzi:
Jest to odniesienie do bieżącej nazwy pliku. W pliku
foo.rb
,__FILE__
zostanie zinterpretowane jako"foo.rb"
.Edycja: Ruby 1.9.2 i 1.9.3 zachowują się nieco inaczej niż to, co powiedział Luke Bayes w swoim komentarzu . Z tymi plikami:
Uruchomienie
ruby test.rb
spowoduje wyjścieźródło
`__FILE__`
aby dostać__FILE__
.Wartością
__FILE__
jest ścieżka względna, która jest tworzona i przechowywana (ale nigdy nie aktualizowana) podczas ładowania pliku. Oznacza to, że jeśli masz jakieś połączenia zDir.chdir
dowolnym innym miejscem w aplikacji, ścieżka ta zostanie nieprawidłowo rozwinięta.Jednym z obejść tego problemu jest przechowywanie rozszerzonej wartości
__FILE__
poza dowolnym kodem aplikacji. Tak długo, jak twojerequire
instrukcje znajdują się na górze definicji (lub przynajmniej przed wywołaniami doDir.chdir
), ta wartość będzie nadal przydatna po zmianie katalogów.źródło
This means that if you have any calls to Dir.chdir anywhere else in your application, this path will expand incorrectly.
Ścieżka rozszerzyła się poprawnie podczas mojego testu. Moja wersja ruby to 2.3.7, być może nowsza wersja ruby naprawiła ten problem.__FILE__
to nazwa pliku z rozszerzeniem pliku zawierającego wykonywany kod.W
foo.rb
,__FILE__
byłoby „foo.rb”.Jeśli
foo.rb
były w reż/home/josh
następnieFile.dirname(__FILE__)
wróci/home/josh
.źródło
W Ruby, wersja dla systemu Windows i tak, właśnie sprawdziłem i
__FILE__
nie zawiera pełnej ścieżki do pliku. Zamiast tego zawiera ścieżkę do pliku względem miejsca, z którego jest wykonywany.W PHP
__FILE__
jest pełna ścieżka (która moim zdaniem jest lepsza). Dlatego, aby twoje ścieżki były przenośne w Rubim, naprawdę musisz użyć tego:Powinienem zauważyć, że w Ruby 1.9.1
__FILE__
zawiera pełną ścieżkę do pliku, powyższy opis dotyczył kiedy użyłem Ruby 1.8.7.Aby być kompatybilnym zarówno z Ruby 1.8.7, jak i 1.9.1 (nie jestem pewien co do wersji 1.9), powinieneś wymagać plików za pomocą konstrukcji pokazanej powyżej.
źródło
File.expand_path(File.dirname(__FILE__) + "/relative/path/to/file")
File.expand_path( File.join( File.dirname(__FILE__), "relative", "path", "to", "file") )