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;尤其是在训练过程中容易遇到梯度消失或梯度爆炸的问题。为了解决这些问题&…

力扣1031. 两个非重叠子数组的最大和

力扣1031. 两个非重叠子数组的最大和 题目解析及思路 题目要求找到两段长分别为firstLen 和 secondLen的子数组&#xff0c;使两段元素和最大 图解见灵神 枚举第二段区间的右端点&#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中的负载均衡…

对象的概念

对象是编程中一个重要的概念&#xff0c;尤其在面向对象编程&#xff08;OOP&#xff09;中更为核心。简单来说&#xff0c;对象是一种数据结构&#xff0c;它可以存储相关的数据和功能。以下是关于对象的详细描述&#xff1a; 1. 对象的定义 对象是属性&#xff08;数据&…

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

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

深入探讨JavaScript中的精度问题:原理与解决方案

深入探讨JavaScript中的精度问题&#xff1a;原理与解决方案 在日常的JavaScript开发中&#xff0c;我们经常会遇到一些令人困惑的数值计算问题&#xff0c;特别是涉及到小数点运算时。例如&#xff0c;为什么0.1 0.2的结果不是预期的0.3&#xff0c;而是0.30000000000000004…

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工具收集了相…

js进阶——深入解析JavaScript中的URLSearchParams

深入解析 JavaScript 中的 URLSearchParams 在现代Web开发中&#xff0c;我们经常需要处理URL中的查询参数&#xff0c;尤其是在构建动态Web应用时。这些查询参数&#xff08;query parameters&#xff09;通常以 ?keyvalue&key2value2 的形式存在。JavaScript 提供了一个…

javascript:void(0)

javascript:void(0)是一种常用于HTML中的Javascript语句&#xff0c;通常用作链接的href属性。它的主要作用是防止链接的默认行为(例如跳转到一个新页面或刷新当前页面)&#xff0c;同时又可以执行一些Javascript代码 详细解释 javascript&#xff1a;这是一个协议&#xff0c…

第十三章 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. 优化登录拦截器 完…

【PostgreSQL】实战篇——数据备份和恢复的最佳实践和工具

数据备份和恢复是确保数据安全性和可用性的关键环节。无论是由于硬件故障、软件错误、数据损坏还是人为错误&#xff0c;能够快速恢复数据都是保护业务连续性的重要措施。 PostgreSQL 提供了多种备份和恢复工具和方法&#xff0c;其中最常用的包括 pg_dump、pg_restore 和点时…

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法&#xff0c;此既是C得以流行的前提&#xff0c;也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符&#xff0c;代表增加&#xff0c;意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思&#xff0c;被称为最早的面向…

电池大师 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;成为企业优选。…