Ruby'de nasıl dosya oluşturulur


170

Yeni bir dosya oluşturmaya çalışıyorum ve işler de beklediğim gibi çalışmıyor. İşte denedim:

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

Çevrimiçi okuduğum her şeye göre bunların hepsi çalışmalı ama her biri bana şunu veriyor:

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

Bu IRB'den ve bir Ruby senaryosundan olur. Neyi kaçırıyorum?


13
İlk ikisi çalışmamalı, ancak ikincisi eş anlamlı ve kesinlikle işe yarıyor.
Andrew Marshall

@Andrew: Sadece ilk ikisinin denendiğini mi düşünüyorsun?
mu çok kısa

1
@muistooshort Ulaşabileceğim tek sonuç bu. Bir izin hatası atılacaktı Errno::EACCES, değil ENOENT.
Andrew Marshall

2
Tamam, şimdi kendimi aptal hissediyorum. İlk ikisi kesinlikle çalışmıyor ama ikincisi çalışıyor. Kendimi onları denediğime nasıl ikna ettiğimden emin değilim. Herkesin zamanını harcadığım için üzgünüm.
Civatrix

1
@Civatrix Sorun değil. Hepimiz zaman kaybediyoruz.
Darth Egregious

Yanıtlar:


434

kullanın:

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

seçenekleriniz:

  • r- Sadece oku. Dosya mevcut olmalıdır.
  • w - Yazmak için boş bir dosya oluşturun.
  • a - Bir dosyaya ekleyin. Dosya yoksa oluşturulur.
  • r+- Hem okuma hem de yazma için bir dosya açın. Dosya mevcut olmalıdır.
  • w+ - Hem okuma hem de yazma için boş bir dosya oluşturun.
  • a+- Okumak ve eklemek için bir dosya açın. Dosya yoksa oluşturulur.

Sizin durumunuzda, 'w'tercih edilir.

VEYA sahip olabilirsiniz:

out_file = File.new("out.txt", "w")
#...
out_file.puts("write your stuff here")
#...
out_file.close

11
mükemmel cevap. Yakut konvntion var isimleri için yılan durumudur. Sadece yeni başlayanlar için bir kafa. outFilegibi görünmelidir out_file.
Adam Waite

3
@AdamWaite Cevabı snake_case önerisine göre düzenledim ve bu yorumu bağlam için bıraktım.
Kris

3
@zanbri - dosyayı kapatmazsam ne olur?
Erran Morad

1
büyük cevap, kapsamlı ve kısa
Boris

2
@BoratSagdiyev "Artık başvurulmayan bir File nesnesi çöp toplama için uygun hale geliyor. File nesnesi çöp toplandığında dosya otomatik olarak kapatılacak." rootr.net/rubyfaq-9.html
jkdev

35

Deneyin

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

kullanmadan

File.new "out.txt"

25

"w+"Yazma modu olarak kullanmak yerine şunu deneyin "w":

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

4
Yalnızca ( w) veya hem okuma hem de yazma ( w+) yazmak isteyip istemediğinize bağlıdır .
jkdev

20

Tamam, şimdi kendimi aptal hissediyorum. İlk ikisi kesinlikle çalışmıyor ama ikincisi çalışıyor. Kendimi onları denediğime nasıl ikna ettiğimden emin değilim. Herkesin zamanını harcadığım için üzgünüm.

Bunun başkalarına yardımcı olması durumunda, varolmayan bir dizinde yeni bir dosya oluşturmaya çalıştığınızda oluşabilir.


11

Dizin mevcut değil. openVar olandan emin olun çünkü sizin için bu dirsleri yaratmaz.

Bunu bir süre önce kendim de gördüm.


11

File.newve File.openvarsayılan 'r'olarak bir dosyanın üzerine yazılmasını önlemek için güvenlik mekanizması olarak mode ( ) işlevini okumak için 'w'Dosyaya çıktı göndereceksek, Ruby'ye yazma modunu ( en yaygın yöntemdir) kullanmasını açıkça söylemeliyiz .

Çıktılacak metin yazmak yerine bir dize ise:

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

ya da daha kötüsü:

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

Daha özlü olanı kullanın write:

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

writeKullanabileceğimiz böylece modları izin verdi 'w', 'a', 'r+'gerekirse.

openbir yinelemeli döngüde çıktıyı hesaplamanız ve dosyayı istediğiniz gibi açık bırakmak istiyorsanız, bir blok ile yararlıdır. writeiçeriği bir patlamada çıkarırsanız, dosyayı kapatırsanız kullanışlıdır.

Daha fazla bilgi için belgelere bakın .


Büyük tepki, bu en deyimsel ve dolayısıyla "Rubyist" yol. En iyi cevap olmalı.
Gino

Tamam katılıyorum. Dosyaları yazmak için nadiren blok formunu kullanıyorum. Çok görsel-gürültülü.
Tin Man

11

Amaç sadece bir dosya oluşturmaksa, gördüğüm en doğrudan yol:

 FileUtils.touch "foobar.txt"

1
data = 'data you want inside the file'.

Kullanabilirsiniz File.write('name of file here', data)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.