Cara membuat file di Ruby

170

Saya mencoba membuat file baru dan hal-hal sepertinya tidak berfungsi seperti yang saya harapkan juga. Inilah yang saya coba:

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

Menurut semua yang saya baca online semua itu harus bekerja tetapi setiap orang memberi saya ini:

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

Ini terjadi dari IRB serta skrip Ruby. Apa yang saya lewatkan?

Civatrix
sumber
13
Dua yang pertama seharusnya tidak bekerja, tetapi dua yang kedua adalah sama dan pasti akan berfungsi.
Andrew Marshall
@Andrew: Anda berpikir bahwa hanya dua yang pertama yang dicoba?
mu terlalu pendek
1
@muistooshort Itulah satu-satunya kesimpulan yang bisa saya raih. Kesalahan izin akan dilemparkan Errno::EACCES, bukan ENOENT.
Andrew Marshall
2
Oke, sekarang saya merasa bodoh. Dua yang pertama pasti tidak bekerja tetapi dua yang kedua tidak. Tidak yakin bagaimana saya meyakinkan diri saya bahwa saya telah mencobanya. Maaf karena membuang waktu semua orang.
Civatrix
1
@Civatrix Itu tidak masalah. Terkadang kita semua membuang waktu.
Darth Egregious

Jawaban:

434

Menggunakan:

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

di mana pilihan Anda:

  • r- Baca saja. File harus ada.
  • w - Buat file kosong untuk menulis.
  • a - Tambahkan ke file. File ini dibuat jika tidak ada.
  • r+- Buka file untuk memperbarui membaca dan menulis. File harus ada.
  • w+ - Buat file kosong untuk membaca dan menulis.
  • a+- Buka file untuk membaca dan menambahkan. File dibuat jika tidak ada.

Dalam kasus Anda, 'w'lebih disukai.

ATAU Anda bisa memiliki:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close
Zanbri
sumber
11
jawaban yang bagus Ruby conevntion adalah case ular untuk nama var. Hanya kepala untuk pemula. outFileakan terlihat seperti out_file.
Adam Waite
3
@AdamWaite Saya mengedit jawaban sesuai saran snake_case Anda, meninggalkan komentar ini untuk konteks.
Kris
3
@zanbri - apa yang terjadi jika saya tidak menutup file?
Erran Morad
1
jawaban yang bagus, komprehensif dan singkat
Boris
2
@BoratSagdiyev "Objek file yang tidak lagi direferensikan menjadi memenuhi syarat untuk pengumpulan sampah. File akan ditutup secara otomatis ketika objek File adalah sampah yang dikumpulkan." rootr.net/rubyfaq-9.html
jkdev
35

Mencoba

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

tanpa menggunakan

File.new "out.txt"
GMD
sumber
25

Coba gunakan "w+"sebagai mode tulis alih-alih hanya "w":

File.open("out.txt", "w+") { |file| file.write("boo!") }
Chris Bunch
sumber
4
Tergantung jika Anda ingin menulis saja ( w) atau keduanya membaca dan menulis ( w+).
jkdev
20

Oke, sekarang saya merasa bodoh. Dua yang pertama pasti tidak bekerja tetapi dua yang kedua tidak. Tidak yakin bagaimana saya meyakinkan diri saya bahwa saya telah mencobanya. Maaf karena membuang waktu semua orang.

Jika ini membantu orang lain, ini dapat terjadi ketika Anda mencoba membuat file baru di direktori yang tidak ada.

tom
sumber
11

Direktori tidak ada. Pastikan itu ada sebagaiopen tidak akan membuat dir untuk Anda.

Saya mengalami ini sendiri beberapa waktu lalu.

nterry
sumber
11

File.newdan File.openmode default to read ( 'r') sebagai mekanisme keamanan, untuk menghindari kemungkinan menimpa file. Kita harus secara eksplisit memberi tahu Ruby untuk menggunakan mode tulis ( 'w'adalah cara yang paling umum) jika kita akan menghasilkan file.

Jika teks yang akan dihasilkan adalah string, daripada menulis:

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

atau lebih buruk:

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

Gunakan yang lebih ringkas write:

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

writetelah mode memungkinkan sehingga kita dapat menggunakan 'w', 'a', 'r+'jika perlu.

opendengan blok berguna jika Anda harus menghitung output dalam loop berulang dan ingin membiarkan file tetap terbuka saat Anda melakukannya. writeberguna jika Anda akan menampilkan konten dalam satu ledakan kemudian tutup file.

Lihat dokumentasi untuk informasi lebih lanjut.

Manusia Timah
sumber
Respons yang bagus, ini adalah cara yang paling idiomatis dan karenanya "Rubyist". Harus menjadi jawaban teratas.
Gino
Ya saya setuju. Saya jarang menggunakan formulir blok untuk menulis file. Terlalu berisik secara visual.
the Tin Man
11

Jika tujuannya hanya untuk membuat file, cara paling langsung yang saya lihat adalah:

 FileUtils.touch "foobar.txt"
Nicola Mingotti
sumber
1
data = 'data you want inside the file'.

Kamu bisa memakai File.write('name of file here', data)

ispirett
sumber
0

Anda juga dapat menggunakan konstanta alih-alih string untuk menentukan mode yang Anda inginkan. Manfaatnya adalah jika Anda membuat kesalahan ketik dengan nama konstan, program Anda akan memunculkan eksepsi runtime.

Konstanta adalah File::RDONLYatau File::WRONLYatau File::CREAT. Anda juga dapat menggabungkannya jika mau.

Deskripsi lengkap tentang mode buka file di ruby-doc.org

Alex Tamoykin
sumber