Diferencia entre OPEN_ALWAYS y CREATE_ALWAYS en CreateFile() de la API de Windows

2 minutos de lectura

¿Alguien puede explicar cuál es la diferencia entre las disposiciones de creación OPEN_ALWAYS y CREATE_ALWAYS del Crea un archivo() función de la API de Windows?

Para mí, parece que ambos simplemente ‘crean el archivo si aún no existe’.

avatar de usuario
Jon

CREATE_ALWAYS también trunca el contenido si el archivo ya existe. Por otra parte, OPEN_ALWAYS no eliminará un archivo ya existente.

Así es como funcionan los diferentes valores en forma tabular:

                         |                    When the file...
This argument:           |             Exists            Does not exist
-------------------------+------------------------------------------------------
CREATE_ALWAYS            |            Truncates             Creates
CREATE_NEW         +-----------+        Fails               Creates
OPEN_ALWAYS     ===| does this |===>    Opens               Creates
OPEN_EXISTING      +-----------+        Opens                Fails
TRUNCATE_EXISTING        |            Truncates              Fails

  • Eso era exactamente lo que esperaba: es gracioso que la documentación esté formulada de manera tan vaga. Gracias.

    – Kristian Spangsege

    22 de enero de 2013 a las 23:02

  • Bonita mesa. Algunos pensamientos aleatorios: si el archivo existe, hay 3 resultados: Trunca, falla, abre; si el archivo no existe hay 2 resultados: Crea, falla. Entonces 3*2 = 6 comportamientos diferentes. Desde el falla/falla es totalmente inútil, solo quedan 5 posibilidades, ¡y aquí están!

    – rodrigo

    22 de enero de 2013 a las 23:10


  • También lo que es importante agregar a esa tabla es lo que sucede con el puntero de archivo cuando se abre un archivo existente (cuando OPEN_ALWAYS o OPEN_EXISTING se especifica.) En ambos casos, el puntero del archivo apuntará al principio del archivo. Entonces, si luego comienza a escribir en ese archivo, sobrescribirá el comienzo del archivo y no lo haré añádalo al final del archivo. Para cambiar ese uso SetFilePointerEx funcionar con FILE_END bandera antes de escribir.

    – ahmd0

    22 de julio de 2017 a las 21:37


  • @ahmd0 Dónde WriteFiles termina en realidad depende de la máscara de acceso, si solo solicita la adición de archivo, se escribirá al final del archivo en NT.

    – Anders

    4 sep 2019 a las 18:33


¿Ha sido útil esta solución?