Ruby2.6アドベントカレンダーの10日目の記事です。
IO
ファイルオープン時のモードに x
追加
https://bugs.ruby-lang.org/issues/11258
ファイルを作成用にオープンするには w
を指定しますが、これはファイルが既に存在していた場合に上書きして空にしてしまいます。
それを避けるために次のようなコードをたまに見ることがありますが、これは他の方法で排他制御していなければ危険です。
raise "File exists" if File.exist?("hoge.txt") # 他プロセスがこのタイミングでファイルを作ってるかもしれない File.open("hoge.txt", "w")
今までは次のようにしていました。
File.open("hoge.txt", File::CREAT|File::EXCL) #=> ファイルが存在していたらエラー File exists @ rb_sysopen - hoge.txt (Errno::EEXIST)
File::CREAT
, File::EXCL
は C 由来の名前ですが、ちょっと呪文じみててわかりにくいです。
C11 でどうやら fopen(3) に x
というモードが追加されたらしく、それに合わせて Ruby 2.6 でも次のように書くことができるようになりました。
File.open("hoge.txt", "wx") #=> ファイルが存在していたらエラー File exists @ rb_sysopen - hoge.txt (Errno::EEXIST)
簡単に書けるようになって便利!