Ruby File.open дает "Нет такого файла или каталога - ошибка text.txt(Errno:: ENOENT)"
Я установил Ruby 1.9.2 на свою машину Win 7. Создал простой analyzer.rb
файл. Он имеет одну строку:
File.open("text.txt").each {|line| puts line}
Когда я запускаю код, он дает мне эту ошибку:
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
Я не понимаю. Существует файл text.txt
в том же каталоге, что и файл analyzer.rb
. Я также попытался подавать абсолютный путь файла, C:\Ruby192\text.txt
, но не кубик. Что мне не хватает?
Ответы
Ответ 1
Начните с выяснения, что ваш текущий рабочий каталог для вашего запуска script.
Добавьте эту строку в начало:
puts Dir.pwd
.
Это скажет вам, в каком текущем рабочем рубине работает ruby script. Скорее всего, вы увидите это не там, где вы предполагаете. Затем убедитесь, что вы правильно указали пути для окон. См. Документы здесь, как правильно форматировать пути для окон:
http://www.ruby-doc.org/core/classes/IO.html
Затем либо используйте Dir.chdir
, чтобы изменить рабочий каталог на то место, где указано text.txt, либо укажите абсолютный путь к файлу в соответствии с инструкциями в документах IO выше. Это СЛЕДУЕТ сделать это...
EDIT
Добавление третьего решения, которое может быть наиболее удобным, если вы помещаете текстовые файлы в свои файлы script:
Dir.chdir(File.dirname(__FILE__))
Это автоматически изменит текущий рабочий каталог на тот же каталог, что и файл .rb
, на котором запущен script.
Ответ 2
ENOENT
означает, что он не существует.
Просто обновите свой код до:
File.open(File.dirname(__FILE__) + '/text.txt').each {|line| puts line}
Ответ 3
Используйте chomp()
или chomp()
с помощью STDIN
то есть. test1.rb
print 'Enter File name: '
fname = STDIN.gets.chomp() # or fname = gets.chomp()
fname_read = File.open(fname)
puts fname_read.read()
Ответ 4
Попробуйте использовать
Dir.glob(".")
Чтобы узнать, что в каталоге (и, следовательно, какой каталог он ищет).
Ответ 5
Рядом с неправильным каталогом я просто споткнулся о другой вариант:
У меня был взрыв File.open(my_file).each {|line| puts line}
, но было что-то под этим именем в каталоге, в котором я работал (в командной строке указано имя). Я проверил с помощью File.exists?(my_file)
который странно вернулся false
. Объяснение: my_file
была символической ссылкой, цель которой больше не существовала! Поскольку File.exists?
будет следовать символической ссылке, он скажет false
, хотя ссылка все еще существует.
Ответ 6
Ответ Ditto Casper:
puts Dir.pwd
Как только вы узнаете текущий рабочий каталог, укажите путь к файлу относительно этого каталога.
Например, если ваш рабочий каталог является корнем проекта, вы можете открыть файл под ним прямо следующим образом
json_file = File.read(myfile.json)