Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do open a file for writing only if it doesn't already exist in ruby

Tags:

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?

like image 940
nohat Avatar asked Mar 07 '11 22:03

nohat


1 Answers

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 
like image 165
nohat Avatar answered Oct 16 '22 11:10

nohat