Difference between OPEN_ALWAYS and CREATE_ALWAYS in CreateFile() of Windows API
Asked Answered
D

1

32

Can anyone explain what the difference is between the creation dispositions OPEN_ALWAYS and CREATE_ALWAYS of the CreateFile() function of the windows API?

To me it seems that they both simply 'create the file if it does not already exist'.

Depilate answered 22/1, 2013 at 22:57 Comment(0)
S
84

CREATE_ALWAYS also truncates the contents if the file already exists. On the other hand, OPEN_ALWAYS will not clobber an already existing file.

Here's how the different values work in tabular form:

                         |                    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
Sherer answered 22/1, 2013 at 22:59 Comment(4)
That was exactly what I was hoping - funny that the documentation is so vaguely formulated. Thanks.Depilate
Nice table. Some random thoughts: if the file exists there are 3 outcomes: Truncates, Fails, Opens; if the file does not exist there are 2 outcomes: Creates, Fails. So 3*2 = 6 different behaviours. Since the Fails/Fails is totally useless, only 5 possibilities remains, and here they are!Treat
Also what is important to add to that table is what happens to the file pointer when existing file is opened (when OPEN_ALWAYS or OPEN_EXISTING is specified.) In both cases the file pointer will point to the beginning of the file. So, if you then start writing into that file, it will overwrite the beginning of the file and will not append it to the end of file. To change that use SetFilePointerEx function with FILE_END flag before writing.Unrestrained
@Unrestrained Where WriteFiles ends up actually depends on the access mask, if you only ask for file-append it will write to the end of the file on NT.Lerner

© 2022 - 2024 — McMap. All rights reserved.