I want to open a file for writing but only if it doesn't already exist. If the file exists I want to raise an exception. Is this the best way to do it?
filename = 'foo' raise if File.exists? filename File.open(filename, 'w') do |file| file.write contents end
What is the most idiomatic way to do this without the race condition?
After doing some further research, it seems you can use the File::CREAT and File::EXCL mode flags.
filename = 'foo' File.open(filename, File::WRONLY|File::CREAT|File::EXCL) do |file| file.write contents end
In this case, open
will raise an exception if the file exists. After running once, this program succeeds without error, creating a file named foo
. On the second run, the program emits this:
foo.rb:2:in `initialize': File exists - foo (Errno::EEXIST) from foo.rb:2:in `open' from foo.rb:2
From man open
:
O_WRONLY open for writing only O_CREAT create file if it does not exist O_EXCL error if O_CREAT and the file exists
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With