首页 > 编程语言 >Window系统编程 - 文件操作

Window系统编程 - 文件操作

时间:2024-10-11 11:19:26浏览次数:8  
标签:文件 HANDLE 句柄 编程 写入 Window DWORD NULL

前言

  • 各位师傅大家好,我是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()参数详解,以及读写文件的函数使用,怎么利用错误码调试

标签:文件,HANDLE,句柄,编程,写入,Window,DWORD,NULL
From: https://blog.csdn.net/weixin_58038441/article/details/142773877

相关文章

  • mac电脑禁止生成 .DS_Store 文件的解决方法
    一、禁止生成.DS_store文件macOS可以通过命令行修改系统配置,让系统不再在文件夹中生成这个配置文件,命令如下:defaultswritecom.apple.desktopservicesDSDontWriteNetworkStorestrue如果此命令不生效,可以使用下方命令(注意:命令行中-m之后为你的目录,此命令只能指定目录生效)......
  • 量化交易需要哪些编程技能,都有哪些优势?
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)股票量化,Python炒股,CSDN交流社区>>>Python:量化交易的核心编程语言Python的基础优势Python在量化交易中犹如一把万能钥匙。它的简洁性使得即使是编程新手也能快速上手。对于......
  • 如何用PyQt5创建多个窗口,同时获取多个U盘内的文件的名称,并分别在对应窗口打印文件名,要
    在PyQt5中,你可以使用QThread创建多个线程来并行处理每个U盘的文件名获取任务。每个线程负责扫描一个U盘的文件,同时在主窗口显示结果。以下是一个示例代码,用来创建多个窗口,同时在每个窗口中显示各自的U盘文件名:每个窗口使用QWidget。使用QThread创建后台线程获取U......
  • 实验1 现代C++编程初体验
    实验任务11//现代C++标准库、算法库体验2//本例用到以下内容:3//1.字符串string,动态数组容器类vector、迭代器4//2.算法库:反转元素次序、旋转元素5//3.函数模板、const引用作为形参67#include<iostream>8#include<string>9#inc......
  • Java中使用jcifs库操作SMB协议进行文件操作
    简介SMB是一种网络通信协议,用于计算机在网络上进行文件共享、打印服务以及其他资源的共享。jcifs是一个纯Java实现的SMB客户端库,它允许Java应用程序访问SMB共享资源。环境准备在开始之前,确保你的项目中已经添加了jcifs库的依赖。如果使用Maven,可以在pom.xml文件中添加以下依赖:......
  • [编程笔记] 未能加载文件或程序集“...”或它的某一个依赖项。试图加载格式不正确的程
    使用IIS部署站点,指向代码根目录,启动时报“未能加载文件或程序集“...”或它的某一个依赖项。试图加载格式不正确的程序。” 直接启动项目是可以的,解决上述错误很简单,看下项目属性: 这里是x86位数的,对应系统就是Windows32,一般我们工作用的电脑基本都......
  • Python快速编程小案例——打印蚂蚁森林植树证书
    提示:(个人学习),案例来自工业和信息化“十三五”人才培养规划教材,《Python快速编程入门》第2版,黑马程序员◎编著蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行地铁出行、在线消费等行为,可在蚂蚁森林中获取能量,当能量到达一定数值后,用户可以在支付宝中申请......
  • SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。
    SMB签名是ServerMessageBlock(SMB)协议中的一种安全机制,旨在确保数据的完整性和身份验证。1.什么是SMB签名?SMB签名是一种通过数字签名技术保障数据在网络传输过程中的完整性和来源验证的机制。它通过对数据进行哈希处理,并附加一个签名,确保接收方能够确认收到的数据没有被篡改。......
  • 程序设计基础I-实验7 函数(编程题)
    7-1sdut-C语言实验—计算表达式计算下列表达式值:输入格式:输入x和n的值,其中x为非负实数,n为正整数。输出格式:输出f(x,n),保留2位小数。输入样例:32输出样例:在这里给出相应的输出。例如:2.00#include<stdio.h>#include<math.h>doublef(doublex,intn){......
  • windowns11更新关闭(2024.10.11最新方法)(通过修改暂停更新参数)
    目前无副作用,原理是使得win11系统更新设置处的暂停更新时间延长来达到暂停更新。方法:win+r,输入regedit打开注册表(如不知道,可以打开“此电脑”访问如下路径:C:\Windows\regedit.exe)2.打开注册表的这个路径:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settin......