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)