Window系统编程 - 文件操作

news2024/11/25 2:49:00

前言

  • 各位师傅大家好,我是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.coloradmin.cn/o/2202437.html

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

相关文章

泰始明昌文旅:如何打造真正的文旅爆品体系

泰始明昌文旅&#xff1a;如何打造真正的文旅爆品体系 泰始明昌文旅&#xff1a;如何打造真正的爆品体系 关键词&#xff1a;泰始明昌文旅,文旅爆品,核心卖点,用户痛点,项目特点,对手弱点,爆品体系,爆品品类,结构化,品质,价值链接,生态体系,营销推广,持续创新 摘要&#xff…

Adobe Acrobat提示“3D数据解析错误”

原因&#xff1a;在使用Adobe Acrobat打开3D PDF时&#xff0c;因当前Adobe Acrobat的配置存在错误&#xff0c;所以无法打开 解决方法&#xff1a;重新生成配置 首先到达下面的路径C:\Users\你的用户名\AppData\Local\Adobe\Acrobat 下面为我的路径内容 若该路径下存在文件…

第 2 章 基础支持层(上)

2.1 解析器模块 常见的 XML 处理方式 DOM&#xff0c;基于树形结构的 XML 解析方式&#xff0c;它会将整个 XML 文档读入内存并构建一个 DOM 树&#xff0c;基于这棵树形结构对各个节点&#xff08;Node&#xff09;进行操作。 SAX&#xff0c;基于事件模型的 XML 解析方式&a…

如何制作低代码开发的视频教程?

如何制作低代码开发的视频教程&#xff1f; 随着数字化转型的加速&#xff0c;越来越多的企业和组织开始采用低代码开发平台来加速应用程序的构建。对于许多开发者和业务人员来说&#xff0c;学习如何使用这些平台可以显著提高工作效率。因此&#xff0c;创建一份清晰、实用且…

数字化AI新赋能,智享AI直播:开启一个全新的直播时代!

数字化AI新赋能&#xff0c;智享AI直播&#xff1a;开启一个全新的直播时代! 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活和工作方式。其中&#xff0c;AI直播技术的崛起&#xff0c;无疑是数字化时代的一大亮…

springMVC添加webapp

项目结构-->模块-->找到想添加的模块下的web 点击号 添加路径 会在.../src/main/目录下自动生成目录

Javaava版本ERP管理系统源码-打造企业核心竞争力:ERP管理系统创新实践

在数字化转型的浪潮中&#xff0c;企业对于高效、稳定且易于扩展的管理系统的需求日益增长。为了满足这一需求&#xff0c;我们开发了一款基于Java技术的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统&#xff0c;该系统通过Spring Cloud Alibaba、Spring …

Axios 网络请求

文章目录 Axios 网络请求1.Axios 使用1.Axios 简介2.Axios 安装安装命令 3.Axios 引入方式全局引入局部引入 2.整合 vue1.在组件中使用 axios 发送请求发送结果这里就出现了跨域问题 3.跨域后端解决办法全局配置类 加入注解 CrossOrigin请求结果 全局配置 baseUrl Axios 网络请…

dressler电源维修LFGS-1250C射频电源维修

LFGS射频发生器是用于半导体生产和一般等离子处理的多功能射频发生器。此类可变频率发生器采用了一种半桥、D类型放大器理念&#xff0c;是一种空冷式紧凑型的设计&#xff0c;可安装在19英寸机架上面。应用包括溅射、等离子蚀刻、化学气象沉积、聚合以及表面处理设备上。 维修…

电抗器运行噪声振动规范

电抗器在运行过程中会产生一定的噪声和振动&#xff0c;特别是在大功率、高电流条件下。因此&#xff0c;为了保证电抗器的安全运行和降低噪声对环境的影响&#xff0c;需遵循相关规范和标准。以下是电抗器运行噪声和振动的常见规范和要求&#xff1a; 一、噪声规范 电抗器的…

基于ADS的混频器设计

混频器是射频微波电路系统中不可或缺的部件。 无论是微波通信、 雷达、 遥控、 遥感&#xff0c;还是侦察与电子对抗&#xff0c;以及许多微波测量系统&#xff0c;都必须把微波信号用混频器降到中低频来进行处理。 因为集成式混频器体积小&#xff0c;设计技术成熟&#xff0c…

动态感知,趋势预警,非可视化大屏莫属

动态感知与趋势预警至关重要。而此时&#xff0c;非可视化大屏莫属。它如同一个智慧的窗口&#xff0c;将复杂的数据转化为直观的图像与动态图表。实时更新的数据在大屏上跳动&#xff0c;让你清晰把握每一个变化瞬间。无论是市场趋势的微妙波动&#xff0c;还是业务进展的动态…

Vue2 ant-design 设置mode=“[‘month‘, ‘month‘]“时,选择时间后弹框不关闭

废话不多说&#xff0c;直接上代码&#xff1a; <template><div class"page-main"><a-range-pickervalue-format"YYYY-MM"format"YYYY-MM"v-model"billMonth":open"monthPickShow"panelChange"handleP…

点云深度学习方法

深度学习点云数据处理主要涉及&#xff1a; 分类(Classification)、分割(Segmentation)、目标检测&#xff08;Object Detection&#xff09;、实例分割(Panoptic Segmentation)、配准(Registration)、点云重构(Reconstruction)。 论文&#xff1a;Deep Learning for 3D Poin…

深入解析 DolphinScheduler 任务调度、拆分与执行全流程

Apache DolphinScheduler介绍 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Dag背景知识 摘录了一下Dag的offical定义 A graph is f…

宠物空气净化器该怎么选?希喂,小米、安德迈这三款好用吗?

不得不说&#xff0c;虽然现在购物网站的活动不少&#xff0c;可力度都好弱啊&#xff01;我想买宠物空气净化器很久了&#xff0c;觉得有点贵&#xff0c;一直没舍得入手。价格一直没变化&#xff0c;平台小活动根本没什么优惠&#xff0c;只能寄希望于双十一了&#xff0c;准…

开源项目|“智慧光伏”开源项目技术文档

【基于ELF 1开发板完成的“智慧光伏”项目】 “智慧光伏”项目能够智能追踪阳光的移动轨迹。通过内置的光敏传感器和智能控制系统&#xff0c;实时感知周围光源的变化&#xff0c;并驱动太阳能板精准调整角度&#xff0c;确保每一缕阳光都能被最大化地捕捉和利用。下面就和各位…

爬虫常用正则表达式用法

在网页爬虫中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种非常有用的工具&#xff0c;用于从 HTML、JSON 或其他文本格式中提取特定的数据。下面是一些常见的正则表达式及其在爬虫中的应用场景&#xff1a;

如何利用phpstudy创建mysql数据库

phpStudy诞生于2007年&#xff0c;是一款老牌知名的PHP开发集成环境工具&#xff0c;产品历经多次迭代升级&#xff0c;目前有phpStudy经典版、phpStudy V8&#xff08;2019版&#xff09;等等&#xff0c;利用phpstudy可以快速搭建一个mysql环境&#xff0c;接下来我们就开始吧…

Html 标题加图标

每个网页选项卡都有一个图标&#xff1a; <meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>主页</title><link rel"icon" href"images/记事本.png&…