Подтвердить что ты не робот

Как открыть файл для записи, только если он еще не существует в рубине

Я хочу открыть файл для записи, но только если он еще не существует. Если файл существует, я хочу создать исключение. Это лучший способ сделать это?

filename = 'foo'
raise if File.exists? filename
File.open(filename, 'w') do |file| 
  file.write contents
end

Каков самый идиоматический способ сделать это без условия гонки?

4b9b3361

Ответ 1

После дальнейших исследований кажется, что вы можете использовать флаги File:: CREAT и File:: EXCL.

filename = 'foo'
File.open(filename, File::WRONLY|File::CREAT|File::EXCL) do |file|
  file.write contents
end

В этом случае open вызовет исключение, если файл существует. После запуска один раз эта программа завершается без ошибок, создавая файл с именем foo. Во втором запуске программа выдает следующее:

foo.rb:2:in `initialize': File exists - foo (Errno::EEXIST)
    from foo.rb:2:in `open'
    from foo.rb:2

От 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