window api 文件操作之CreateFile、ReadFile和WriteFile

2023-11-05

1. CreateFile

  这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错,会设置 GetLastError 。 
  函数的声明定义:

  HANDLE WINAPI CreateFile(
  _In_      LPCTSTR lpFileName,              
  _In_      DWORD dwDesiredAccess,
  _In_      DWORD dwShareMode,
  _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_      DWORD dwCreationDisposition,
  _In_      DWORD dwFlagsAndAttributes,
  _In_opt_  HANDLE hTemplateFile
);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

参数列表:

参数 类型描述
lpFileName String ,要打开的文件的名字
dwDesiredAccess Long ,如果为 GENERIC_READ 表示允许对设备进行读访问;如果为 GENERIC_WRITE 表示允许对设备进行写访问(可组合使用);如果为零,表示只允许获取与一个设备有关的信息
dwShareMode Long ,零表示不共享; FILE_SHARE_READ 和 / 或 FILE_SHARE_WRITE 表示允许对文件进行共享访问
lpSecurityAttributes SECURITY_ATTRIBUTES ,指向一个 SECURITY_ATTRIBUTES 结构的指针,定义了文件的安全特性(如果操作系统支持的话)
dwCreationDisposition Long ,下述常数之一:CREATE_NEW 创建文件; 如文件存在则会出错CREATE_ALWAYS 创建文件,会改写前一个文件;OPEN_EXISTING 文件必须已经存在。由设备提出要求;OPEN_ALWAYS 如文件不存在则创建它; TRUNCATE_EXISTING 将现有文件缩短为零长度
dwFlagsAndAttributes Long ,一个或多个下述常数:FILE_ATTRIBUTE_ARCHIVE 标记归档属性;FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式;FILE_ATTRIBUTE_NORMAL 默认属性; FILE_ATTRIBUTE_HIDDEN 隐藏文件或目录;FILE_ATTRIBUTE_READONLY 文件为只读;FILE_ATTRIBUTE_SYSTEM 文件为系统文件;FILE_FLAG_WRITE_THROUGH 操作系统不得推迟对文件的写操作; FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作;FILE_FLAG_NO_BUFFERING 禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块;FILE_FLAG_RANDOM_ACCESS 针对随机访问对文件缓冲进行优化; FILE_FLAG_SEQUENTIAL_SCAN 针对连续访问对文件缓冲进行优化 ;FILE_FLAG_DELETE_ON_CLOSE 关闭了上一次打开的句柄后,将文件删除。特别适合临时文件;
hTemplateFile Long ,如果不为零,则指定一个文件句柄。新文件将从这个文件中复制扩展属性

2. ReadFile

  从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作。 
  函数声明定义:

  BOOL WINAPI ReadFile(
  __in          HANDLE hFile,                   // 文件句柄
  __out         LPVOID lpBuffer,                // 接收数据用的 buffer
  __in          DWORD nNumberOfBytesToRead,     // 要读取的字节数
  __out         LPDWORD lpNumberOfBytesRead,    // 实际读取到的字节数
  __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 结构,一般设定为 NULL 
);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代码示例:

BOOL Read(char *filePath)
{
    HANDLE pFile;
    DWORD fileSize;
    char *buffer,*tmpBuf;
    DWORD dwBytesRead,dwBytesToRead,tmpLen;

    pFile = CreateFile(filePath,GENERIC_READ,          
        FILE_SHARE_READ,
        NULL,               
        OPEN_EXISTING,        //打开已存在的文件 
        FILE_ATTRIBUTE_NORMAL, 
        NULL);

    if ( pFile == INVALID_HANDLE_VALUE)
    {
        printf("open file error!\n");
        CloseHandle(pFile);
        return FALSE;
    }

    fileSize = GetFileSize(pFile,NULL);          //得到文件的大小

    buffer = (char *) malloc(fileSize);
    ZeroMemory(buffer,fileSize);
    dwBytesToRead = fileSize;
    dwBytesRead = 0;
    tmpBuf = buffer;

    do{                                       //循环读文件,确保读出完整的文件    

        ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);

        if (dwBytesRead == 0)
            break;

        dwBytesToRead -= dwBytesRead;
        tmpBuf += dwBytesRead;

        } while (dwBytesToRead > 0);

        //  TODO 处理读到的数据 buffer

    free(buffer);
    CloseHandle(pFile);

    return TRUE;
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

3. WriteFile

  将数据写入一个文件。该函数比fwrite函数要灵活的多。也可将这个函数应用于对通信设备、管道、套接字以及邮槽的处理。返回时,TRUE(非零)表示成功,否则返回零。会设置GetLastError。 
函数声明定义:

BOOL WINAPI WriteFile(
  __in          HANDLE hFile,                   // 文件句柄
  __in          LPCVOID lpBuffer,               // 要写入的数据
  __in          DWORD nNumberOfBytesToWrite,    // 要写入的字节数
  __out         LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
  __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 结构,一般设定为 NULL
);

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

代码示例:

BOOL Write(char *buffer, DWORD contentLen)
{
    HANDLE pFile;
    char *tmpBuf;
    DWORD dwBytesWrite,dwBytesToWrite;

    pFile = CreateFile(filePath,GENERIC_WRITE,          
        0,
        NULL,               
        CREATE_ALWAYS,        //总是创建文件
        FILE_ATTRIBUTE_NORMAL, 
        NULL);

    if ( pFile == INVALID_HANDLE_VALUE)
    {
        printf("create file error!\n");
        CloseHandle(pFile);
        return FALSE;
    }

    dwBytesToWrite = contentLen;
    dwBytesWrite = 0;

    tmpBuf = buffer;

    do{                                       //循环写文件,确保完整的文件被写入  

        WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);

        dwBytesToWrite -= dwBytesWrite;
        tmpBuf += dwBytesWrite;

        } while (dwBytesToWrite > 0);

    CloseHandle(pFile);

    return TRUE;
}


from:http://blog.csdn.net/jeanphorn/article/details/44982273




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

window api 文件操作之CreateFile、ReadFile和WriteFile 的相关文章

  • 可重入锁-Reentrant

    Reentrant Re entrant 可重复进入 什么叫可重入 线程可以进入任何一个它已经拥有的锁所同步着的代码块 可重锁作用 防止死锁 常用的可重入锁 JDK ReentrantLock java util concurrent lo
  • 如何异步+队列实现接入阿里云事件监控

    阿里云监控服务可用于收集获取阿里云资源的监控指标或用户自定义的监控指标 探测服务可用性 以及针对指标设置警报 使您全面了解阿里云上的资源使用情况 业务的运行状况和健康度 并及时收到异常报警做出反应 保证应用程序顺畅运行 阿里云事件监控文档地
  • C_单链表去重

    include
  • ubuntu18.04安装mysql5.7

    ubuntu18 04安装mysql5 7 一 安装MySQL 1 安装mysql服务 2 检查状态 3 注意查看mysql版本使用 4 查看MySQL5 7默认账号和密码 二 配置MySQL 三 查mysql服务状态 四 修改root账户
  • uView在uniapp中样式完全失效问题

    最近开发微信小程序和钉钉小程序 使用uniapp UI库准备使用uView 但是按官网引入之后 在小程序模拟器上样式完全无效 而H5正常 解决方法 由于Hbuilderx版本问题 编译的代码中会多出一行样式 可以更换3 2 16版本 亲测有
  • SecureCRT创建串口连接

    鉴于没有在网上找到很好的图解SecureCRT创建串口连接方式 自己写一篇作为备忘录 同时 便于有同样需求的朋友可以快速方便的创建串口连接方式 一 工具 电脑 串口线和超级终端 本文选择SecureCRT 二 方法步骤 1 点击设备管理 查
  • Android EditText接收扫码枪输入,有时缺位,有时出现两次回车

    最近做Android项目时 需要使用外接扫码枪扫描条码 并且接收条码输入的EditText同时还要能接收商品名称的输入 在开发调试的过程中发现 使用扫码枪时会出现条码信息丢失 或者扫码输入过程中出现两次Enter的情况 问题1 扫码枪扫码后
  • JS逆向 - 破解oklink加密参数及加密数据

    版权声明 原创不易 本文禁止抄袭 转载 侵权必究 目录 一 JS逆向目标 会当临绝顶 二 JS逆向分析 不识庐山真面目 三 JS逆向测试 只缘身在此山中 四 JS反逆向 柳暗花明又一村 五 oklink逆向完整代码下载 六 作者Info 一
  • 微信小程序期末大作业-天使童装商城

    微信小程序期末大作业 天使童装商城 导入即可使用 有轮播图 底部导航 各种童装标签 有首页 分类 优惠券 购物车 个人中心五个导航 适合初学者学习使用 如下图所示 资源链接在末尾 资源下载链接 https download csdn net
  • 拉普拉斯噪声满足ε-差分隐私的定义

    差分隐私的定义如下 给定一个兄弟数据集D和D 他们两者之间至多相差一条数据 然后给定一个映射函数 f D R d f D rightarrow R d
  • 史上最全的WebSettings说明

    setAllowContentAccess boolean allow 是否允许在WebView中访问内容URL Content Url 默认允许 内容Url访问允许WebView从安装在系统中的内容提供者载入内容 setAllowFile
  • 前后端分离的vue项目如何合并?springboot 单体应用

    首先是有这么两个应用 前端是vue项目 后端是springboot 构建的服务端 现在是需求是 这个项目很轻量级 完全没必要部署为两个应用 因此需要重新合并 具体步骤如下 第一步 vue项目先打包 执行命令 npm run build 执行
  • PyQt QSpinBox 详细用法 Python

    PyQt QSpinBox 详细用法 Python PyQt 是一个流行的 Python GUI 编程工具包 它提供了丰富的界面元素和功能 使开发人员能够创建强大的图形用户界面 QSpinBox 是 PyQt 中的一个小部件 它允许用户通过
  • 《Qt 5.9 C++开发指南》第2.1节 UI文件设计与运行机制【完整版】

    2 1 UI文件设计与运行机制 2 1 1 项目文件组成 本节实例程序samp2 1完整源程序下载地址 https download csdn net download hongandyi 10413776 在Qt Creator中新建一个
  • 【读论文】多核学习算法及其在高光谱图像分类中的应用研究进展(2021)

    读论文 多核学习算法及其在高光谱图像分类中的应用研究进展 2021 李广洋 DOI 10 12082 dqxxkx 2021 200536 文章目录 摘要 关键词 结论 该论文研究了什么 摘要 多核学习算法在高光谱图像分类领域占据着十分重要
  • 常用工作方法总结(7S、SWOT分析、PDCA循环、SMART原则、6W2H、时间管理、WBS等)

    文章目录 一 7S规则 1 1 推行7S的目的 1 2 7S的概念 二 二八定律 三 SWOT分析法 四 PDCA循环 五 SMART原则 六 6W2H工作方法 七 时间管理 八 WBS工作分解 九 碎石问题分析法 一 7S规则 1 1 推

随机推荐

  • ER图(实体-联系图)

    概念 E R图也称实体 联系图 Entity Relationship Diagram 提供了表示实体类型 属性和联系的方法 用来描述现实世界的概念模型 构成 ER图有实体 entity 属性 attribute 关系 relationsh
  • 光 线 追 踪

    本文首先将会介绍光线追踪的类别族谱 介绍其公共部分 之后我们会分别对其中的每一个进行详细地剖析 光线追踪 Ray tracing 是一个拥有历史感的词汇 图形学从业者从neutron transport heat transfer和illu
  • 有不用出门就能做的副业吗?

    疫情期间一个00后的女孩在家隔离两周 做视频剪辑赚了4000多 是怎么做的呢 其实操作方法并不难 大周也用这个方法在头条上注册了一个新号 虽然时间不长但也赚了3000多 今天这期内容来给粉丝们分享一下操作流程 如果你也想做 可以给大周扣 8
  • com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONObject报错处理

    一 简介 项目A引用项目B的jar作为依赖 启动的时候也没问题 执行项目B中的一段代码的时候就报错了 代码如下 Map
  • scope=“scope“和作用域插槽

    试试目录 1 之前的使用 测试 1 之前的使用 父组件
  • 后台静默检测U盘并复制U盘内指定文件到电脑指定目录(U盘助手)

    马上期末考试了 老师复习课讲得PPT是精简版的 老师说了之前上课的PPT可以给但是这个不可以 如果得到期末必过了 本想着把我这个自己花了3个多小时做的U盘助手在教室的电脑上运行着 下课我就可以得到PPT了 但是无奈我如此正义凛然 以及信息安
  • js的基本使用

    1 使用方式 引用位置 js的引用位置和css的一样要在HTML中进行 但又有些许不同 例如
  • Linux常用命令和网络攻击面试总结

    Linux 浏览目录下的文件列表 ls 选项 创建文件目录命令 mkdir 选项 目录名称 删除空文件夹 rmdir 删除文件 目录 rm rf 强制删除 复制文件 目录 cp r 目录1 目录2 递归复制 目录1所有的文件和文件夹到目录2
  • 第一次构建项目报错 Command line is too long.

    1 报错文本内容 Error running AllApplication Command line is too long Shorten command line for AllApplication or also for Sprin
  • 2018 年了,你还是只会 npm install 吗?

    转载自 https www sohu com a 226831801 505818 nodejs 社区乃至 Web 前端工程化领域发展到今天 作为 node 自带的包管理工具的 npm 已经成为每个前端开发者必备的工具 但是现实状况是 我们
  • Pytorch 配置 Tensorboard 可视化学习(一)

    安装 pip install i https mirrors aliyun com pypi simple tensorboard 使用案例 新建一个python的文件 写入 from torch utils tensorboard imp
  • automount挂载文件系统

    Automount是自动挂载NFS的一种方法 所谓自动挂载 就是让客户端自动触发mount命令把NFS文件系统挂载到本机的挂载点而不需要人工操作 这将给系统管理员节省大量的工作 特别是在大规模集群中 当客户端和NFS数量都比较少的时候 最简
  • 爬虫之requests异步抓取、多协成、多线程(六)

    1 多线程 threading 2 线程池 multiprocessing 3 协程 2 1代理池 多协程分页爬取图片 1 多线程 threading import time from multiprocessing pool import
  • C++中的数据类型-double

    double是浮点型数据类型 双精度 有效数字15位 float是单精度 两者是相对应的 精度相差两倍 所以得出单双两个结论 有效数字7位 但是我们在使用cout进行输出的时候会发现只有六位数字 整数部分加小数部分 一旦两个部分的数字超过六
  • 嵌入式理论基础

    嵌入式概念介绍 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 第一章 嵌入式概念介绍 嵌入式概念介绍 波特率与比特率 波特率与比特率 单片机或计算机在串口通信时的速率 指的是信号被调制以后在单位时间内的变化 即单位时间内
  • 正确利用Vue这些修饰符帮我节省20%的开发时间

    为了方便大家写代码 vue js给大家提供了很多方便的修饰符 比如我们经常用到的取消冒泡 阻止默认事件等等 目录 表单修饰符 事件修饰符 鼠标按键修饰符 键值修饰符 v bind修饰符 实在不知道叫啥名字 表单修饰符 填写表单 最常用的是什
  • Linux零拷贝技术

    目录 前言 传统数据交互 零拷贝 mmap write 小结 sendfile sendfile DMA 小结 splice 小结 前言 在Linux系统内部缓存和内存容量都是有限的 更多的数据都是存储在磁盘中 对于Web服务器来说 经常需
  • 打开chm文件,不显示文件内容的解决办法

    事件描述 今天在网上下了一个chm的文件 打是打开后 只有目录 右侧不显示内容 解决办法 右键点击文件 属性 看到 最下面有一个提示 说是这个文件是来自其他计算机的 边上有一个解锁 点击 解锁 再试一下 应该就可以了 详细解决办法 许多用户
  • octane

    今天遇到的问题是octane的跑分抖动很大 lock了 CPU EMC 的freq和core之后 还是有很大差异 不知道是为何 octane的总分计算是subtest求几何平均值得到total score 并没有权重 所以应该是整体出了问题
  • window api 文件操作之CreateFile、ReadFile和WriteFile

    1 CreateFile 这个函数的功能是创建或者打开一个文件或者I O设备 通常使用的I O形式有文件 文件流 目录 物理磁盘 卷 终端流等 如执行成功 则返回文件句柄 INVALID HANDLE VALUE 表示出错 会设置 GetL