Как открыть файл для записи, только если он еще не существует в ruby - PullRequest
20 голосов
/ 08 марта 2011

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

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

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

1 Ответ

30 голосов
/ 08 марта 2011

После дальнейших исследований кажется, что вы можете использовать флаги режима 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...