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
最初の2つは機能しないはずですが、次の2つは同義であり、確実に機能するはずです。
Andrew Marshall、

@Andrew:最初の2つだけが試されたとお考えですか?
muが短すぎます

1
@muistooshortそれが私が到達できる唯一の結論です。許可エラーはスローされましたがErrno::EACCES、スローされませんでしたENOENT
Andrew Marshall、

2
さて、今私は愚かだと感じています。最初の2つは確実に機能しませんが、次の2つは機能します。私がそれらを試したことを自分にどのように確信させたのか分かりません。みんなの時間を無駄にしてすみません。
Civatrix 2011年

1
@Civatrixそれは問題ありません。私たちは皆、時々時間を無駄にします。
Darth Egregious

回答:


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
素晴らしい答え。Ruby接続は、var名のヘビの場合です。初心者向けです。outFileのようになりout_fileます。
アダムウェイト2013

3
@AdamWaite私はあなたのsnake_case提案に従って回答を編集し、このコメントをコンテキストに残しました。
クリス2013

3
@zanbri-ファイルを閉じないとどうなりますか?
Erran Morad 2014

1
すばらしい回答、包括的かつ簡潔
Boris

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 2015年

20

さて、今私は愚かだと感じています。最初の2つは確実に機能しませんが、次の2つは機能します。私がそれらを試したことを自分にどのように確信させたかはわかりません。みんなの時間を無駄にしてすみません。

これが他の人を助ける場合、存在しないディレクトリに新しいファイルを作成しようとしたときに発生する可能性があります。


11

ディレクトリが存在しません。openそれらのディレクトリを作成しないので、それが存在することを確認してください。

私はしばらく前にこれに遭遇しました。


11

File.newそして、File.open(モードを読み取るために、デフォルト'r'のファイルを上書きする可能性を避けるために、安全機構として)。'w'ファイルに出力する場合は、書き込みモード(最も一般的な方法)を使用するようにRubyに明示的に指示する必要があります。

出力するテキストが書き込みではなく文字列の場合:

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コンテンツを一気に出力してファイルを閉じる場合に便利です。

詳細については、ドキュメントを参照しください。


素晴らしい反応、これは最も慣用的であり、したがって「ルビイスト」の方法です。一番の答えになるはずです。
Gino

そうですね。ブロックフォームを使用してファイルを書き込むことはほとんどありません。視覚的にうるさい。
Tin Man

11

目的が単にファイルを作成することである場合、私が見る最も直接的な方法は次のとおりです。

 FileUtils.touch "foobar.txt"


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.