【问题标题】:Difference between OPEN_ALWAYS and CREATE_ALWAYS in CreateFile() of Windows APIWindows API 的 CreateFile() 中 OPEN_ALWAYS 和 CREATE_ALWAYS 的区别
【发布时间】:2013-01-22 22:57:05
【问题描述】:

谁能解释一下windows API的CreateFile()函数的创建配置OPEN_ALWAYSCREATE_ALWAYS有什么区别?

在我看来,它们似乎都只是“如果文件不存在则创建文件”。

【问题讨论】:

    标签: c windows createfile


    【解决方案1】:

    CREATE_ALWAYS 如果文件已经存在,也会截断内容。另一方面,OPEN_ALWAYS 不会破坏已经存在的文件。

    以下是表格形式的不同值的工作方式:

                             |                    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
    

    【讨论】:

    • 这正是我所希望的——有趣的是,文档的表述如此含糊。谢谢。
    • 漂亮的桌子。一些随机的想法:如果文件存在,则有 3 个结果:截断、失败、打开;如果文件不存在,则有 2 个结果:创建,失败。所以 3*2 = 6 种不同的行为。由于 Fails/Fails 完全没用,只剩下 5 种可能性,就在这里!
    • 另外,添加到该表的重要内容是打开现有文件时file pointer 会发生什么(指定OPEN_ALWAYSOPEN_EXISTING。)在这两种情况下,文件指针都会指向文件的开头。因此,如果您随后开始写入该文件,它将覆盖文件的开头,并且 不会 将其附加到文件的末尾。要更改它,请在写入之前使用 SetFilePointerEx 函数和 FILE_END 标志。
    • @ahmd0 WriteFiles 最终的位置实际上取决于访问掩码,如果您只要求文件附加,它将写入 NT 上的文件末尾。
    猜你喜欢
    • 2010-10-31
    • 2018-12-29
    • 2013-08-05
    • 1970-01-01
    • 2012-10-09
    • 2015-01-20
    • 2012-08-10
    • 2010-12-05
    • 2013-10-26
    相关资源
    最近更新 更多