Як створити файл у 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. Що я пропускаю?


13
Перші два не повинні працювати, але другі два є синонімами і, безумовно, повинні працювати.
Ендрю Маршалл

@Andrew: Ви думаєте, що судили лише перших двох?
му занадто короткий

1
@muistooshort Це єдиний висновок, до якого я можу дійти. Помилка дозволів кинула б Errno::EACCES, ні ENOENT.
Ендрю Маршалл

2
Гаразд, зараз я почуваюся дурним. Перші два точно не працюють, але другі два. Не впевнений, як я переконав себе, що спробував їх. Вибачте, що витрачаєте час на всіх.
Civatrix

1
@Civatrix Це не проблема. Всі ми інколи марнуємо час.
Дарт Егрегійний

Відповіді:


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

11
чудова відповідь. Рубі-коневіція - це зміїний випадок для імен вар. Просто голова для новачків. 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"

25

Спробуйте використовувати "w+"як режим запису замість просто "w":

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

4
Залежить, чи потрібно писати тільки ( w) або читати і писати ( w+).
jkdev

20

Гаразд, зараз я почуваюся дурним. Перші два точно не працюють, але другі два. Не впевнений, як я переконав себе, що спробував їх. Вибачте, що витрачаєте час на всіх.

Якщо це допомагає комусь іншому, це може статися, коли ви намагаєтеся створити новий файл у каталозі, який не існує.


11

Каталог не існує. Переконайтесь, що він існує, оскільки openне створить для вас цих грядок.

Я наткнувся на це сам деякий час назад.


11

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
data = 'data you want inside the file'.

Можна використовувати File.write('name of file here', data)


0

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

Константи є File::RDONLYабо File::WRONLYабо File::CREAT. Ви також можете комбінувати їх, якщо хочете.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.