Ruby’s File.open dă eroarea „No such file or directory – text.txt (Errno::ENOENT)” (Programare, Ruby)

Ege Ersoz a intrebat.

Am instalat Ruby 1.9.2 pe mașina mea Win 7. Am creat un simplu analyzer.rb fișier simplu. Acesta are această singură linie:

File.open("text.txt").each {|line| puts line}

Când execut codul, îmi dă următoarea eroare:

analyzer.rb:1:in `initialize': No such file or directory - text.txt (Errno::ENOENT)
from analyzer.rb:1:in `open'
from analyzer.rb:1:in `<main>'
Exit code: 1

Nu înțeleg. Există un text.txt în același director ca și fișierul analyzer.rb fișier. Am încercat, de asemenea, să introduc calea absolută a fișierului, C:Ruby192text.txt, , dar fără succes. Ce îmi scapă?

Comentarii

  • Pentru aceia dintre noi care au căutat orbește pe Google acest lucru pe baza unei erori dintr-un script, poate însemna că fișierul pe care îl căutați nu există! Dacă codul dvs. nu a verificat existența fișierului, aceasta poate fi întreaga dvs. problemă. –  > Por Noah Sussman.
6 răspunsuri
Casper

Începeți prin a vă da seama ce ați făcut directorul de lucru curent este pentru scriptul dvs. în curs de execuție.
Adăugați această linie la început:

puts Dir.pwd.

Aceasta vă va spune în ce director de lucru curent rulează ruby scriptul dumneavoastră. Cel mai probabil veți vedea că nu este acolo unde credeți că este. Apoi, asigurați-vă că specificați corect numele căilor de acces pentru Windows. Vedeți în documentația de aici cum să formatați corect numele de cale pentru Windows:

http://www.ruby-doc.org/core/classes/IO.html

Apoi, utilizați fie Dir.chdir pentru a schimba directorul de lucru în locul în care se află text.txt, fie specificați calea absolută către fișier în conformitate cu instrucțiunile din documentele IO de mai sus. Asta ar trebui să fie suficient…

EDITARE

Adăugarea unei a 3-a soluții, care ar putea fi cea mai convenabilă, dacă puneți fișierele text printre fișierele de script:

Dir.chdir(File.dirname(__FILE__))

Aceasta va schimba automat directorul de lucru curent în același director cu directorul .rb fișier care rulează scriptul.

Comentarii

  • Asta a fost tot. Dir.pwd a făcut treaba. Se uita la C:Ruby192 în timp ce eu puneam fișierul text în C:Ruby192bin. După ce l-am plasat în locația corectă, a funcționat ca prin minune. Vă mulțumesc! –  > Por Ege Ersoz.
  • @enraged camel: În general, nu ar trebui să puneți fișierele text acolo. Cu cât te joci mai mult cu fișierele de acolo, cu atât este mai probabil să ștergi ceva ce nu ar trebui. –  > Por Andrew Grimm.
  • Mulțumesc! Am avut aceeași problemă cu Nagios care rulează scriptul ruby în fundal… Dir.chdir a rezolvat problema! –  > Por Arpit.
Până la

ENOENT înseamnă că nu este acolo.

Doar actualizează-ți codul la:

File.open(File.dirname(__FILE__) + '/text.txt').each {|line| puts line}

Comentarii

  • Vă mulțumim pentru răspuns. Cu toate acestea, nu pare să fi ajutat. Primesc în continuare aceeași eroare, chiar dacă text.txt există în directorul de instalare Ruby, chiar lângă fișierul .rb. Care sunt câteva motive posibile pentru care nu îl găsește? –  > Por Ege Ersoz.
  • De fapt, cea mai bună soluție ar putea fi Dir.chdir(File.dirname(__FILE__)). În acest fel, veți garanta că directorul de lucru este același cu cel al scriptului. –  > Por Casper.
  • De asemenea, puteți utiliza File.open(File.expand_path(__FILE__, … așa cum se sugerează în github.com/travis-ci/travis-ci/issues/… –  > Por E. Sambo.
Bhaveshkumar

Vă rugăm să utilizați chomp() sau chomp() cu STDIN

adică test1.rb

print 'Enter File name: '

fname = STDIN.gets.chomp()  # or fname = gets.chomp()


fname_read = File.open(fname)

puts fname_read.read()

Andrew Grimm

Încercați să utilizați

Dir.glob(".") 

Pentru a vedea ce se află în director (și, prin urmare, la ce director se uită).

wrtsprt

Pe lângă faptul că se află în directorul greșit, tocmai m-am împiedicat de o altă variantă:

Am avut un File.open(my_file).each {|line| puts line} care exploda, dar exista ceva cu acest nume în directorul în care lucram (ls din linia de comandă arăta numele). Am verificat cu un File.exists?(my_file)care în mod ciudat a returnat false. Explicație: my_file era un symlink a cărui țintă nu mai exista! Din moment ce File.exists? va urma o legătură simbolică, va spune false cu toate că legătura este încă acolo.

Hua2308

Idem răspunsul lui Casper:

puts Dir.pwd

De îndată ce cunoașteți directorul de lucru curent, specificați calea fișierului relativ la acel director.

De exemplu, dacă directorul de lucru este rădăcina proiectului, puteți deschide un fișier sub el direct, în felul următor

json_file = File.read(myfile.json)

Tags: