当前位置: 首页 > news >正文

Win32 方法 CreateFile 中选择合适的文件打开模式(CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, OPEN_ALWAYS, TRUNCATE_EXI

Windows 打开文件的 API 中提供了多种不同的文件打开方式。你可以根据你的业务场景选择适合你的文件打开方式。


本文内容

    • Windows API
    • `dwCreationDisposition`
      • `CREATE_NEW`
      • `CREATE_ALWAYS`
      • `OPEN_EXISTING`
      • `OPEN_ALWAYS`
      • `TRUNCATE_EXISTING`

Windows API

OpenFile 方法只能打开已经存在的文件,而使用 CreateFile 则可以在打开文件的同时应对不存在文件时的创建。

HANDLE CreateFileW(
  LPCWSTR               lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);

其中 dwCreationDisposition 参数用来指定文件打开的时候如何处理文件的创建和追加行为。

dwCreationDisposition

dwCreationDisposition 可以传入 5 种不同的值。

  • CREATE_NEW
  • CREATE_ALWAYS
  • OPEN_EXISTING
  • OPEN_ALWAYS
  • TRUNCATE_EXISTING

为了方便查阅,我先将大家可能关心的内容做一个表格:

dwCreationDisposition如果文件存在如果文件不存在
CREATE_NEWERROR_FILE_EXISTS新建
CREATE_ALWAYS截断新建
OPEN_EXISTING打开ERROR_FILE_NOT_FOUND
OPEN_ALWAYS打开新建
TRUNCATE_EXISTING截断ERROR_FILE_NOT_FOUND

所有这些打开模式都不会修改到文件的属性(Attribute),包括创建时间、针对用户的权限设置。所以如果你希望连这些属性都不需要,而是完完全全创建新的文件,那么请先将原来的文件删除。

CREATE_NEW

如果文件不存在,则创建一个文件。如果文件不存在,则执行失败,通过 GetLastError 可以得到错误码 ERROR_FILE_EXISTS (80)。

CREATE_ALWAYS

如果文件不存在,则创建一个新的文件。如果文件已经存在,则此文件将完全被复写。

基于此文件流的修改会完全复写文件。也就是说,如果原文件内容是 walterlv,通过此文件流写入 111,那么最终文件内容是 111

OPEN_EXISTING

如果文件存在,则打开文件。如果文件不存在,通过 GetLastError 可以得到错误码 ERROR_FILE_NOT_FOUND (2)。

基于此文件流的修改不会截断文件。也就是说,如果原文件内容是 walterlv,通过此文件流写入 111,那么最终文件内容是 111terlv

OPEN_ALWAYS

如果文件存在,那么会成功打开文件;并且也可以通过 GetLastError 可以得到状态 ERROR_ALREADY_EXISTS (183)。如果文件不存在,新建一个文件。

基于此文件流的修改不会截断文件。也就是说,如果原文件内容是 walterlv,通过此文件流写入 111,那么最终文件内容是 111terlv

TRUNCATE_EXISTING

如果文件存在,则打开后文件的长度直接变为 0。如果文件不存在,通过 GetLastError 可以得到错误码 ERROR_FILE_NOT_FOUND (2)。


参考资料

  • CreateFileW function (fileapi.h) - Win32 apps - Microsoft Docs

我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。

如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。

知识共享许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

相关文章:

  • 使用 Kestrel 为你的 ASP.NET Core 服务添加 https 支持
  • 三种方法为 ASP.NET Core 对外服务添加 https 支持(kestrel / frp / nginx)
  • 为 ASP.NET Core 程序制作 URL 的 301/302 跳转
  • 使用 Frp 为你的 Web 服务添加 https 支持
  • 全民 https!使用 FreeSSL 申请免费的 https 证书
  • 如何设置 ASP.NET Core 程序监听的 IP 和端口
  • 收集的 Linux VPS 在线重装系统脚本
  • Linux 系统根目录下的文件夹
  • 修复 Windows 10 设置界面里面混乱的语言翻译
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • 用命令行执行 .NET 单元测试时,如何仅执行符合某些条件的单元测试
  • WPF 中如何绑定附加属性?XAML 中记得加括号,C# 中记得不能用字符串
  • VSCode:当匹配到结果时,如何一次性全部选中操作(复制 删除)?
  • Unity3D 入门:安装 Unity3D 并配置与 Visual Studio 的协作开发环境
  • 在 Visual Studio 2019 (16.5) 中查看托管线程正在等待的锁被哪个线程占用
  • 5、React组件事件详解
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • gitlab-ci配置详解(一)
  • hadoop集群管理系统搭建规划说明
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • iOS编译提示和导航提示
  • Java 23种设计模式 之单例模式 7种实现方式
  • JAVA 学习IO流
  • Java-详解HashMap
  • Map集合、散列表、红黑树介绍
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • ubuntu 下nginx安装 并支持https协议
  • web标准化(下)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 半理解系列--Promise的进化史
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 对JS继承的一点思考
  • 分布式任务队列Celery
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 如何学习JavaEE,项目又该如何做?
  • 使用Swoole加速Laravel(正式环境中)
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 手写双向链表LinkedList的几个常用功能
  • 积累各种好的链接
  • 整理一些计算机基础知识!
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​Python 3 新特性:类型注解
  • ​卜东波研究员:高观点下的少儿计算思维
  • #includecmath
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #Z0458. 树的中心2
  • (Ruby)Ubuntu12.04安装Rails环境
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (六)Hibernate的二级缓存
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • . Flume面试题