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

170

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

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, так и из сценария Ruby. Чего мне не хватает?

Civatrix
источник
13
Первые два не должны работать, но вторые два являются синонимами и определенно должны работать.
Эндрю Маршалл
@ Андрей: Вы думаете, что судили только первые два?
мю слишком коротко
1
@muistooshort Это единственный вывод, к которому я могу прийти. Ошибка разрешения была бы выброшена Errno::EACCES, нет ENOENT.
Эндрю Маршалл
2
Хорошо, теперь я чувствую себя глупо. Первые два определенно не работают, но вторые два работают. Не уверен, как я убедил себя, что я попробовал их. Извините за тратить время всех.
Civatrix
1
@Civatrix Это не проблема. Мы все иногда тратим время.
Дарт Egregious

Ответы:

434

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

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
zanbri
источник
11
отличный ответ. Ruby conevntion - случай змеи для имен var. Просто головы для новичков. outFileдолжен выглядеть так out_file.
Адам Уэйт
3
@AdamWaite Я отредактировал ответ в соответствии с вашим предложением snake_case, оставив этот комментарий для контекста.
Крис
3
@zanbri - что произойдет, если я не закрою файл?
Эрран Морад
1
отличный ответ, полный и краткий
Борис
2
@BoratSagdiyev "Объект File, на который больше не ссылаются, становится пригодным для сборки мусора. Файл будет автоматически закрыт, когда объект File будет собирать мусор." rootr.net/rubyfaq-9.html
jkdev
35

Пытаться

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

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

File.new "out.txt"
GMD
источник
25

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

File.open("out.txt", "w+") { |file| file.write("boo!") }
Крис Банч
источник
4
Зависит от того, хотите ли вы писать только ( w) или одновременно читать и писать ( w+).
jkdev
20

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

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

Том
источник
11

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

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

nterry
источник
11

File.newи по File.openумолчанию read mode ( '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полезно, если вы собираетесь вывести содержимое за один раз, а затем закрыть файл.

Смотрите документацию для получения дополнительной информации.

жестяной человек
источник
Отличный ответ, это самый идиоматичный и, таким образом, «рубиновый» путь. Должен быть главный ответ.
Джино
Ну, я согласен. Я редко использую блочную форму для записи файлов. Это слишком визуально шумно.
Оловянный Человек
11

Если цель состоит в том, чтобы просто создать файл, самый прямой путь, который я вижу:

 FileUtils.touch "foobar.txt"
Никола Минготти
источник
1
data = 'data you want inside the file'.

Ты можешь использовать File.write('name of file here', data)

ispirett
источник
0

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

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

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

Алекс Тамойкин
источник