Terima kasih @ Geoff. Adalah baik untuk melihat pengguna baru membersihkan pertanyaan dan jawaban yang sudah ketinggalan zaman. Membuat situs yang lebih baik secara keseluruhan.
jdl
7
Saya menemukan ini ironis. Jawabannya didokumentasikan dengan sangat baik ... tetapi sekarang setahun kemudian, pertanyaan ini adalah hit pertama di Google. Ketika pertanyaan diajukan, mungkin terlihat bahwa OP mendedikasikan sedikit usaha tetapi sekarang sejauh yang menyangkut Google, ini adalah sumber terbaik.
Jeff
7
Mungkin karena semua yang perlu Anda ketahui ada di sini. Milik saya adalah jawaban "ajarlah seorang pria untuk menangkap ikan" bagi mereka yang ingin membaca perincian yang lebih baik, dan ada banyak jawaban "beri seorang ikan untuk seorang pria" di sini juga untuk orang-orang yang hanya ingin memotong dan menempel. Tidak mengherankan bahwa kombinasi ini berakhir dengan peringkat baik di Google.
jdl
1
Jadi, dalam keadilan, saya bekerja dalam banyak bahasa yang berbeda, yang berarti saya jarang bisa mengingat sintaks untuk bahasa tertentu. Saya sudah googled ini beberapa kali, dan saya selalu menggulir melewati jawaban ini, ke yang di bawahnya, karena ketika saya google StackOverflow saya biasanya hanya mencari ikan dang. : p Jujur saja, ada baiknya memiliki keduanya. Mungkin suatu hari nanti saya akan melakukan cukup Ruby sekaligus sehingga saya akan peduli dengan detailnya.
user435779
2
Ini tidak menjawab pertanyaan. Ini hanya menunjuk ke dua kelas yang berisi sebagian besar metode untuk melakukan I / O, dan tidak menyebutkan koneksi dengan database. Itu akan baik-baik saja sebagai komentar, tetapi hampir tidak memenuhi syarat sebagai jawaban. Saya menyadari bahwa OP dan banyak pembaca yang mengangkat jawaban ini tidak setuju, dan saya terus terang tidak mengerti apa yang mereka pikirkan.
FYI metode singkat ini hanya bekerja dimulai dengan Ruby 1.9.3. Tidak ada metode seperti itu di versi 1.9 atau 1.8 sebelumnya. Dalam hal ini Anda harus menggunakan metode blok lagi yang diposting oleh @mvndaai
Ketika blok dilewatkan ke File.open, objek File akan ditutup secara otomatis ketika blok berakhir.
Jika Anda tidak meneruskan blokir File.open, Anda harus memastikan bahwa file ditutup dengan benar dan konten ditulis ke file.
begin
file =File.open("/tmp/some_file","w")
file.write("your text")rescueIOError=> e
#some error occur, dir not writable etc.ensure
file.close unless file.nil?end
static VALUE rb_io_s_open(int argc, VALUE *argv, VALUE klass){
VALUE io = rb_class_new_instance(argc, argv, klass);if(rb_block_given_p()){return rb_ensure(rb_yield, io, io_close, io);}return io;}
Ya, menggunakan sintaks blok dengan {| file | ....} akan menutup file ketika blok ditutup.
wesgarrison
Keren Terimakasih. Saya tidak yakin tentang itu. Berikut ini beberapa info lebih lanjut tentang blok dan File.openblog.rubybestpractices.com/posts/rklemme/… itu juga disebutkan dalam dokumentasi resmi
Tombart
1
Hanya sesuatu yang ruby way-ish: nil adalah objek, jadi untuk memeriksa apakah file itu nol, Anda bertanya objek itu sendiri alih-alih membandingkan (file.nil? Bukan file == nil)
JCabello
@JCabello yakin, itu pasti pendekatan yang lebih mirip Ruby, terima kasih!
Tombart
akhirnya jawaban yang menunjukkan bahwa seseorang juga harus memeriksa status file dan cara menanganinya, dan bukan hanya satu liner yang hanya menunjukkan panggilan terbuka.
Saya terkejut bahwa jawaban yang diakui menyalin jawaban lain dapat menerima lebih dari 100 suara positif. Saya bisa melihat memposting kalimat pertama sebagai komentar pada pertanyaan, tapi hanya itu.
Cary Swoveland
@CarySwoveland Saya sebenarnya setuju dengan Anda. Masalah sebenarnya adalah bahwa salah satu dari dua pertanyaan seharusnya sudah ditandai sebagai duplikat lama. Saya menyalin jawaban itu karena begitu saya menemukan pertanyaan yang dijawab zanbri dan beberapa kali berikutnya ketika saya membutuhkan informasi yang sama saya pertama-tama menemukan pertanyaan ini dan harus mencari cara untuk mendapatkan pertanyaan lainnya. Akhirnya, saya pikir akan lebih mudah untuk mendapatkan jawabannya di sini juga. Saya ditautkan ke jawabannya sehingga mudah-mudahan, orang-orang akan mengklik dan memberinya upvote juga.
mvndaai
31
Bagi kita yang belajar dengan contoh ...
Tulis teks ke file seperti ini:
IO.write('/tmp/msg.txt','hi')
INFO BONUS ...
Baca kembali seperti ini
IO.read('/tmp/msg.txt')
Seringkali, saya ingin membaca file di clipboard saya ***
Clipboard.copy IO.read('/tmp/msg.txt')
Dan di lain waktu, saya ingin menulis apa yang ada di clipboard saya ke file ***
IO.write('/tmp/msg.txt',Clipboard.paste)
*** Mengasumsikan Anda memiliki permata clipboard diinstal
Waspadai IO.writeopsi menimpa konten file alih-alih menambahkan. Tambahkan dengan IO.write agak membosankan.
fguillen
Tidak yakin apa yang Anda bicarakan? Perintah IO.write tidak memerlukan opsi itu untuk menulis ke file. Saya akan berhati-hati untuk menyimpan file ke direktori / tmp atau direktori saat ini; Jika tidak, Anda mungkin melihat Errno::ENOENT: No such file or directory @ rb_sysopenpesan dan file dibuat dengan ukuran 0 byte.
13x
25
Untuk memusnahkan konten file sebelumnya, lalu tulis string baru ke file:
open('myfile.txt','w'){|f| f <<"some text or data structures..."}
Untuk menambahkan file tanpa menimpa konten lamanya:
open('myfile.txt',"a"){|f| f <<'I am appended string'}
Apakah Anda mencari yang berikut ini?
sumber
yourfile
adalah variabel yang menyimpan nama file yang akan ditulis.f.write
memunculkan Exception.File.write('filename', 'content')
IO.write('filename', 'content')
Anda dapat menggunakan versi singkat:
Ini mengembalikan panjang yang ditulis; lihat :: tulis untuk detail dan opsi lebih lanjut.
Untuk menambahkan file, jika sudah ada, gunakan:
sumber
Ini adalah pendekatan yang lebih disukai dalam kebanyakan kasus:
Ketika blok dilewatkan ke
File.open
, objek File akan ditutup secara otomatis ketika blok berakhir.Jika Anda tidak meneruskan blokir
File.open
, Anda harus memastikan bahwa file ditutup dengan benar dan konten ditulis ke file.Anda dapat menemukannya di dokumentasi :
sumber
File.open
blog.rubybestpractices.com/posts/rklemme/… itu juga disebutkan dalam dokumentasi resmiJawaban Zambri yang ditemukan di sini adalah yang terbaik.
tempat pilihan Anda
<OPTION>
adalah: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.sumber
Bagi kita yang belajar dengan contoh ...
Tulis teks ke file seperti ini:
INFO BONUS ...
Baca kembali seperti ini
Seringkali, saya ingin membaca file di clipboard saya ***
Dan di lain waktu, saya ingin menulis apa yang ada di clipboard saya ke file ***
*** Mengasumsikan Anda memiliki permata clipboard diinstal
Lihat: https://rubygems.org/gems/clipboard
sumber
IO.write
opsi menimpa konten file alih-alih menambahkan. Tambahkan dengan IO.write agak membosankan.Errno::ENOENT: No such file or directory @ rb_sysopen
pesan dan file dibuat dengan ukuran 0 byte.Untuk memusnahkan konten file sebelumnya, lalu tulis string baru ke file:
Untuk menambahkan file tanpa menimpa konten lamanya:
sumber