Window系统编程 - 文件操作

前言

  • 各位师傅大家好,我是qmx_07,今天主要介绍使用windows系统编程操作读写文件
    在这里插入图片描述

文件

CreateFile()函数讲解

  • 介绍:该函数用于打开文件或者I/O流设备,文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和管道

  • 接下来我们学习一下CreateFile这个函数,需要对各参数有一定了解
    函数原型:

HANDLE CreateFileA([in]           LPCSTR                lpFileName, //要打开的文件名称[in]           DWORD                 dwDesiredAccess,//对文件的访问权限,比如读写[in]           DWORD                 dwShareMode,//文件的共享权限[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,//指针[in]           DWORD                 dwCreationDisposition,//对已经存在的文件,或不存在的文件 进行什么操作[in]           DWORD                 dwFlagsAndAttributes,//文件或设备属性标志[in, optional] HANDLE                hTemplateFile//模版文件
);

简单了解参数含义,接下来进行详细讲解
这边的A 版本代表Ascii环境,W代表 Unicode环境,EX代表拓展版本函数

lpFileName
  • 要创建的文件或者设备名称,假如我要在D盘创建hello.txt,该参数内容如下:
D:\\hello.txt
  • 一般会将该参数限制到MAX_PATH字符为260
    在这里插入图片描述
dwDesiredAccess
  • 对文件或者设备的访问权限
    在这里插入图片描述
  • 常见的全部权限、可读、可写、可执行
dwShareMode
  • 文件或者设备的共享模式,如果为NULL,则不允许共享访问
    在这里插入图片描述
lpSecurityAttributes
  • 该参数主要用作继承
  • 文件操作:文件的访问权限和句柄的继承属性
  • 进程创建:继承父进程的资源访问
dwCreationDisposition
  • 对于已经存在的文件,或不存在的文件,做出操作
    在这里插入图片描述
    在这里插入图片描述
  • 以上是对文件的两种状况,及作用总结
dwFlagsAndAttributes
  • 设置文件的属性或标志
    在这里插入图片描述
  • 这几个文件属性比较常用
hTemplateFile
  • GENERIC_READ 访问权限的模板文件的有效句柄

写文件

	HANDLE hFile = CreateFile("G:\\qmx.ini", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFile){std::cout << "CreateFile Faild" << std::endl;std::cout << GetLastError() << std::endl;}CHAR * Buffer[MAX_PATH] = { 0 };CHAR arr[20] = "hello world!";DWORD length = strlen(arr);memcpy(Buffer, arr, length);DWORD NumerOfBytesWritten = 0;BOOL Ret = WriteFile(hFile, Buffer, length, &NumerOfBytesWritten, NULL);if (!Ret){std::cout << "WriteFile Faild" << std::endl;std::cout << GetLastError() << std::endl;}CloseHandle(hFile);
  • 通过CreateFile创建文件句柄(具有读写权限的普通文件打开)
  • 将向写入的数据写入Buffer,利用WriteFile()写入文件
  • CloseHandle() 关闭句柄
    在这里插入图片描述
    文件被成功写入
WriteFile()

函数原型:

BOOL WriteFile([in]                HANDLE       hFile, //文件或设备句柄[in]                LPCVOID      lpBuffer,//缓冲区[in]                DWORD        nNumberOfBytesToWrite,//写入字符的长度[out, optional]     LPDWORD      lpNumberOfBytesWritten,//实际写入字符的长度[in, out, optional] LPOVERLAPPED lpOverlapped//表示异步I/O操作
);

在这里插入图片描述

  • 创建变量NumerOfBytesWritten,用于存储实际写入的长度,NULL 表示进行同步写入操作
  • WriteFile返回值,如果函数写入失败返回False,写入成功返回True
错误码调试

在这里插入图片描述

  • 将前面写好的文件,改为 CREATE_NEW,使用GetLastError()捕获错误码
    在这里插入图片描述
  • 在工具中的错误查找,查询错误码,能够快速了解到哪里有问题

在这里插入图片描述

  • INVALID_HANDLE_VALUE 代表句柄失效

读取文件

	HANDLE hFile = CreateFile("G:\\qmx.ini", GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (INVALID_HANDLE_VALUE == hFile){std::cout << "CreateFile Faild" << std::endl;std::cout << GetLastError() << std::endl;}LARGE_INTEGER FileSize;if (!GetFileSizeEx(hFile, &FileSize)){std::cout << "GetFileSizeEx Failed" << std::endl;std::cout << GetLastError() << std::endl;}CHAR* Buffer = new CHAR[FileSize.LowPart + 1];memset(Buffer, 0, FileSize.LowPart + 1);DWORD NumberOfBytesRead = 0;BOOL Ret = ReadFile(hFile, Buffer, FileSize.LowPart, &NumberOfBytesRead, NULL);if (!Ret){std::cout << "ReadFile Faild" << std::endl;std::cout << GetLastError() << std::endl;}std::cout << Buffer << std::endl;CloseHandle(hFile);
  • 通过CreateFile创建文件句柄(具有读写权限的普通文件打开)
  • 创建LARGE_INTEGER类型的变量用于存储文件大小,通过GetFileSizeEx判断能否存储
  • 使用ReadFile将文件数据存储到Buffer,并输出
    在这里插入图片描述
ReadFile

在这里插入图片描述

  • LARGE_INTEGER类型原型:
    在这里插入图片描述
  • LowPart存储着32位无符号整型,如果溢出则使用HighPart
BOOL ReadFile([in]                HANDLE       hFile,//文件或设备句柄[out]               LPVOID       lpBuffer,//缓冲区[in]                DWORD        nNumberOfBytesToRead,//读取长度[out, optional]     LPDWORD      lpNumberOfBytesRead,//实际读取的长度[in, out, optional] LPOVERLAPPED lpOverlapped//表示异步I/O操作
);

在这里插入图片描述

  • 读取文件内容,通过FileSize.LowPart 获取文件读取长度,写入Buffer
  • ReadFile返回值,如果函数写入失败返回False,写入成功返回True
文件随机读写
  • 不从开头开始读取,需要使用setFilePointer函数
    原型:
DWORD SetFilePointer([in]                HANDLE hFile,//文件句柄[in]                LONG   lDistanceToMove,//移动的步长[in, out, optional] PLONG  lpDistanceToMoveHigh,//高32位[in]                DWORD  dwMoveMethod//文件指针的位置
);

在这里插入图片描述
在这里插入图片描述

  • 通过setFilePointer函数移动两位步长

文件操作

移动文件

MoveFile(源文件,目标文件),用于移动文件位置
在这里插入图片描述

  • 原理:通过读取文件内容,写入新文件,再将源文件删除
删除文件

在这里插入图片描述

  • 通过DeleteFile(源文件)删除文件
复制文件
  • CopyFile(源文件,目标文件,True) 用于复制文件
    在这里插入图片描述
    在这里插入图片描述

总结

  • 介绍了CreateFile()、WriteFile()、ReadFile()参数详解,以及读写文件的函数使用,怎么利用错误码调试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins Pipline流水线

提到 CI 工具&#xff0c;首先想到的就是“CI 界”的大佬--]enkjns,虽然在云原生爆发的年代,蹦出来了很多云原生的 CI 工具,但是都不足以撼动 Jenkins 的地位。在企业中对于持续集成、持续部署的需求非常多,并且也会经常有-些比较复杂的需求,此时新生的 CI 工具不足以支撑这些很…

看门狗电路设计

看门狗电路设计 看门狗是什么应用架构图TPV6823芯片功能硬件时序图为什么要一般是要保持200个毫秒左右的这种低电平的时间看门狗电路实际应用与条件 看门狗是什么 硬件看门狗芯片&#xff0c;Watch DogTimer&#xff0c;可用于受到电气噪音、电源故障、静电放电等影响(造成软件…

LSTM(长短时记忆网络)

一、引言 在处理序列数据时&#xff0c;循环神经网络&#xff08;RNN&#xff09;虽然能够处理序列数据并保留历史信息&#xff0c;但在实践中发现它对于捕捉长时间依赖关系的能力有限&#xff0c;尤其是在训练过程中容易遇到梯度消失或梯度爆炸的问题。为了解决这些问题&…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4&#xff08;location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖&#xff09;-CSDN博客 目录 14.nginx集群&#xff08;前传&#xff09; 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…

QT入门教程攻略 QT入门游戏设计:贪吃蛇实现 QT全攻略心得总结

Qt游戏设计&#xff1a;贪吃蛇 游戏简介 贪吃蛇是一款经典的休闲益智类游戏&#xff0c;玩家通过控制蛇的移动来吃掉地图上的食物&#xff0c;使蛇的身体变长。随着游戏的进行&#xff0c;蛇的移动速度会逐渐加快&#xff0c;难度也随之增加。当蛇撞到墙壁或自己的身体时&…

Laravel Filament 如何配置多语言支持

演示 一、安装拓展包outerweb/filament-translatable-fields composer require outerweb/filament-translatable-fields配置模型 该套件包含一个名为 HasTranslations 的特性&#xff0c;用于使 Eloquent 模型具备多语言功能。翻译值以 JSON 格式存储&#xff0c;并不需要额外…

Run the FPGA VI 选项的作用

Run the FPGA VI 选项的作用是决定当主机 VI 运行时&#xff0c;FPGA VI 是否会自动运行。 具体作用&#xff1a; 勾选 “Run the FPGA VI”&#xff1a; 当主机 VI 执行时&#xff0c;如果 FPGA VI 没有正在运行&#xff0c;系统将自动启动并运行该 FPGA VI。 这可以确保 FPG…

夜间数据库IO负载飙升?MySQL批量删除操作引发的问题排查

目录 问题现象 问题分析 修改建议 总结 问题现象 近日&#xff0c;某用户反馈他们的MySQL数据库实例在凌晨时段会频繁出现IO负载急剧上升的情况&#xff0c;这种状态会持续一段时间&#xff0c;随后自行恢复正常。为了查明原因&#xff0c;该用户通过DBdoctor工具收集了相…

第十三章 Redis短信登录实战(基于Redis)

目录 一、概述 1.1. Session复制 1.2. 使用Redis 二、基于Redis实现共享Session登录 2.1. 实现思路 2.2. 功能实现的主要代码 2.2.1. 用户业务接口 2.2.2. 用户业务接口实现类 2.2.3. 用户控制层 2.2.4. 登录拦截器 2.2.5. 拦截器配置类 2.3. 优化登录拦截器 完…

电池大师 2.3.9 | 专业电池管理,延长寿命优化性能

Battery Guru 显示电池使用情况信息&#xff0c;测量电池容量&#xff08;mAh&#xff09;&#xff0c;并通过有用技巧帮助用户改变充电习惯&#xff0c;延长电池寿命。支持显示电池健康状况&#xff0c;优化电池性能。 大小&#xff1a;9.6M 百度网盘&#xff1a;https://pan…

26.删除有序数组中的重复项

题目::26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; 思路:只要不和前面的数一样就可以移动指针&#xff0c;进行赋值 代码: class Solution { public:int removeDuplicates(vector<int>& nums) {int slow 0 ;for(int fast 1; fast < …

髓质脊髓三叉神经核文献阅读笔记

文献阅读 1.RNA-seq 对于大量RNA测序&#xff0c;收集第30天的类器官。使用FastPure细胞/组织总RNA分离试剂盒根据制造商的方案提取总RNA。采用Nanodrop 2000分光光度计测定RNA浓度和纯度。使用Agilent 2100生物分析仪和2100 RNA纳米6000检测试剂盒评估RNA样品的完整性。简单…

选型工单管理系统,从原理到应用全面解读

工单管理系统提升客户支持效率&#xff0c;优化内部协作&#xff0c;强化数据分析。选型需明确需求&#xff0c;比较系统功能和特性&#xff0c;评估试用后选择最适合的系统。ZohoDesk凭其多渠道支持、智能分配、自动化工具、协作工具和数据分析能力&#xff0c;成为企业优选。…

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…

MySQL进阶 - 索引

01 索引概述 【1】概念&#xff1a;索引就是一种有序的数据结构&#xff0c;可用于高效查询数据。在数据库表中除了要保存原始数据外&#xff0c;数据库还需要去维护索引这种数据结构&#xff0c;通过这种数据结构来指向原始数据&#xff0c;这样就可以根据这些数据结构实现高…

一个月学会Java 第8天 方法与递归

Day8 方法与递归 方法这个东西我们之前讲过&#xff0c;但是只是讲了原理并没有详细的讲解东西&#xff0c;还有构造器这个东西&#xff0c;也只是介绍过全貌&#xff0c;构造器其实就是一个特殊的方法&#xff0c;但是由于特殊&#xff0c;所以我们之后再讲&#xff0c;还有一…

yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】

yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察&#xff0c;仅仅通过这…

69.【C语言】动态内存管理(重点)(2)

本文为数据结构打下基础 备注:数据结构需要掌握指针,结构体和动态内存管理 承接68.【C语言】动态内存管理(重点)(1)文章 目录 3.free函数 cplusplus网的翻译 提炼要点 使用 x86debug环境下, 打开内存窗口 建议 3.free函数 cplusplus的介绍 点我跳转 cplusplus网的翻译…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机&#xff0c;也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略&#xff0c;对进出的通信流…