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

#ruby #file #io #errno

#ruby #файл #io #ошибка отсутствует

Вопрос:

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

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

Комментарии:

1. Первые два не должны работать, но вторые два являются синонимами и определенно должны работать.

2. @Andrew: Вы думаете, что были опробованы только первые два?

3. @muistoosh Это единственный вывод, к которому я могу прийти. Ошибка разрешений вызвала бы Errno::EACCES , а не ENOENT .

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

5. @Civatrix Это не проблема. Мы все иногда тратим время впустую.

Ответ №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
 

Комментарии:

1. отличный ответ. Ruby conevntion — это змеиный регистр для имен переменных. Просто предупреждение для новичков. outFile должно выглядеть так out_file .

2. @AdamWaite я отредактировал ответ в соответствии с вашим предложением snake_case, оставив этот комментарий для контекста.

3. @zanbri — что произойдет, если я не закрою файл?

4. @BoratSagdiyev «Файловый объект, на который больше нет ссылок, становится пригодным для сборки мусора. Файл будет автоматически закрыт, когда объект File будет собран для мусора. » rootr.net/rubyfaq-9.html

5. @jkdev, да, он будет закрыт, но полагаться на это по-прежнему считается запахом кода, как если бы программист никогда не закрывал файлы и позволял ОС закрывать файлы, когда интерпретатор завершает работу. И то, и другое может привести к серьезной ошибке, если открыто несколько файлов, и код никогда не закрывает их, что приводит к выходу из-под контроля и ошибке. Просто лучше и безопаснее намеренно закрывать их или полагаться на блок, который делает это автоматически.

Ответ №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!") }
 

Комментарии:

1. Зависит от того, хотите ли вы использовать только write ( w ) или read и write ( w ) .

Ответ №4:

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

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

Ответ №5:

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

  FileUtils.touch "foobar.txt"
 

Ответ №6:

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

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

Ответ №7:

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 полезно, если вы собираетесь выводить содержимое за один раз, а затем закрыть файл.

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

Комментарии:

1. Отличный ответ, это самый идиоматичный и, следовательно, «рубиновый» способ. Должен быть главный ответ.

2. Что ж, я согласен. Я редко использую блочную форму для записи файлов. Это слишком визуально шумно.

Ответ №8:

 data = 'data you want inside the file'.
 

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

Ответ №9:

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

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

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