Как создать файл в Ruby

Я пытаюсь создать новый файл, и все, кажется, не работает, как я их ожидаю. Вот что я пробовал:

File.new "out.txt"
File.open "out.txt"
File.new "out.txt","w"
File.open "out.txt","w"

В соответствии со всем, что я читал в Интернете, все из них должны работать, но каждый из них дает мне это:

ERRNO::ENOENT: No such file or directory - out.txt

Это происходит от IRB, а также от рубинового файла. Что мне не хватает?

Ответ 1

Использование:

File.open("out.txt", [your-option-string]) {|f| f.write("write your stuff here") }

где ваши варианты:

  • r - Только чтение. Файл должен существовать.
  • w - Создайте пустой файл для записи.
  • a - Добавить в файл. Файл создается, если он не существует.
  • r+ - открыть файл для обновления и чтения и записи. Файл должен существовать.
  • w+ - Создайте пустой файл для чтения и записи.
  • a+ - открыть файл для чтения и добавления. Файл создается, если он не существует.

В вашем случае предпочтительнее 'w'.

ИЛИ вы могли бы:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close

Ответ 2

Попробуйте

File.open("out.txt", "w") do |f|     
  f.write(data_you_want_to_write)   
end

без использования

File.new "out.txt"

Ответ 3

Попробуйте использовать w+ как режим записи, а не только w:

File.open("out.txt", "w+") { |file| file.write("boo!") }

Ответ 4

Хорошо, теперь я чувствую себя глупо. Первые два, безусловно, не работают, но второй второй. Не знаю, как я убедил себя, что я их пробовал. Извините, что тратил время на все.

Если это помогает кому-то еще, это может произойти, когда вы пытаетесь создать новый файл в директории, которая не существует.

Ответ 5

Каталог не существует. Убедитесь, что он существует, поскольку open не создаст эти dirs для вас.

Я наткнулся на это некоторое время назад.

Ответ 6

File.new и File.open по умолчанию для режима чтения ('r') в качестве механизма безопасности, чтобы избежать возможной перезаписи файла. Мы должны явно указать Ruby на использование режима записи ('w' является наиболее распространенным способом), если мы собираемся вывести файл.

Если текст, который будет выводиться, представляет собой строку, а не запись:

File.open('foo.txt', 'w') { |fo| fo.puts "bar" }

или хуже:

fo = File.open('foo.txt', 'w')
fo.puts "bar"
fo.close

Используйте более сжатый write:

File.write('foo.txt', 'bar')

write имеет разрешенные режимы, поэтому при необходимости мы можем использовать 'w', 'a', 'r+'.

open с блоком полезна, если вам нужно вычислить вывод в итеративном цикле и хотите оставить файл открытым, когда вы это сделаете. write полезно, если вы собираетесь выводить содержимое в один взрыв, затем закройте файл.

Подробнее см. документацию.

Ответ 7

Вы также можете использовать константы вместо строк, чтобы указать нужный вам режим. Преимущество заключается в том, что если вы создадите опечатку в постоянном имени, ваша программа увеличит исключение во время выполнения.

Константы File::RDONLY или File::WRONLY или File::CREAT. Вы также можете комбинировать их, если хотите.

Полное описание режимов открытия файла на ruby-doc.org