2011-03-07 33 views
19

Quiero abrir un archivo para escribir pero solo si no existe. Si el archivo existe, quiero hacer una excepción. ¿Es esta la mejor manera de hacerlo?Cómo abrir un archivo para escritura solo si no existe en ruby ​​

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

¿Cuál es la forma más idiomática de hacer esto sin la condición de carrera?

Respuesta

29

Después de hacer algunas investigaciones adicionales, parece que puede usar los indicadores de modo Archivo :: CREAT y Archivo :: EXCL.

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

En este caso, open lanzará una excepción si existe el archivo. Después de ejecutar una vez, este programa tiene éxito sin error, creando un archivo llamado foo. En la segunda pasada, el programa emite la siguiente:

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

De 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 
Cuestiones relacionadas