Win32API操作文件

news2024/11/25 8:17:18

 在Windows编程中CreateFile函数是用得非常多的,不仅可以打开文件,还可以打开管道、邮槽、通信资源、磁盘设备(早期Windows),控制台、目录。该函数返回一个句柄,该句柄可用于根据文件或设备以及指定的标志和属性访问文件或设备以获取各种类型的I/O。

打开文件

CreateFileW()函数

HANDLE CreateFileW(
  [in]           LPCWSTR               lpFileName,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwCreationDisposition,
  [in]           DWORD                 dwFlagsAndAttributes,
  [in, optional] HANDLE                hTemplateFile
);
  • 参数lpFileName

表示创建或打开的对象的名称

  • 参数dwDesiredAccess

表示访问方式,可以读取、写入、两者、删除、所有这些或 无。下面是该参数可设置的值

取值含义

0

0x00000000

防止其他进程在请求删除、读取或写入访问权限时打开文件或设备。

FILE_SHARE_DELETE

0x00000004

对文件或设备启用后续打开操作以请求删除访问权限。

否则,如果其他进程请求删除访问权限,则无法打开文件或设备。

如果未指定此标志,但已打开文件或设备以进行删除访问,则函数 失败。

注意删除访问权限允许删除和重命名操作。

FILE_SHARE_READ

0x00000001

启用对文件或设备的后续打开操作以请求读取访问权限。

否则,如果其他进程请求读取访问权限,则无法打开文件或设备。

如果未指定此标志,但文件或设备已打开以进行读取访问,则函数 失败。

FILE_SHARE_WRITE

0x00000002

允许对文件或设备执行后续打开操作以请求写入访问权限。

否则,如果其他进程请求写入访问权限,则无法打开文件或设备。

如果未指定此标志,但文件或设备已打开以进行写入访问或具有文件映射 使用写入访问权限时,函数将失败。

  • 参数dwShareMode

表示共享方式,如果某一种访问方式设置为不共享,那么后续如果还有这种方式访问时将会打开失败。

  • 参数lpSecurityAttributes

NULL表示默认安全属性,但是不会被子进程继承

  • 参数dwCreationDisposition

表示如何创建文件,下面是该参数可设置的值。

取值意义

CREATE_ALWAYS

2

始终创建新文件。

如果指定的文件存在且可写,则该函数将覆盖该文件,该函数将成功,并且 最后一个错误代码设置为ERROR_ALREADY_EXISTS(183)。

如果指定的文件不存在并且是有效路径,则创建一个新文件,函数成功,并且 最后一个错误代码设置为零。

有关详细信息,请参阅本主题的“备注”部分。

CREATE_NEW

1

仅当文件尚不存在时才创建新文件。

如果指定的文件存在,则函数将失败,并且最后一个错误代码设置为ERROR_FILE_EXISTS(80)。

如果指定的文件不存在,并且是可写位置的有效路径,则会创建一个新文件。

OPEN_ALWAYS

4

始终打开文件。

如果指定的文件存在,则函数成功,并将最后一个错误代码设置为ERROR_ALREADY_EXISTS(183)。

如果指定的文件不存在,并且是可写位置的有效路径,则该函数将创建一个 文件,最后一个错误代码设置为零。

OPEN_EXISTING

3

仅打开文件或设备(如果存在)。

如果指定的文件或设备不存在,则该函数将失败,并且最后一个错误代码设置为ERROR_FILE_NOT_FOUND(2)。

有关设备的详细信息,请参阅“备注”部分。

TRUNCATE_EXISTING

5

打开文件并将其截断,使其大小为零字节(仅当它存在时)。

如果指定的文件不存在,则该函数将失败,并且最后一个错误代码设置为ERROR_FILE_NOT_FOUND(2)。

调用进程必须打开将GENERIC_WRITE位设置为一部分的文件 dwDesiredAccess参数。

  • 参数dwFlagsAndAttributes

设置文件的属性和标志,FILE_ATTRIBUTE_NORMAL是最多的 文件的通用默认值。

  • 参数hTemplateFile

此参数可以直接为NULL。

 写文件

WriteFile() 函数

BOOL WriteFile(
  [in]                HANDLE       hFile,
  [in]                LPCVOID      lpBuffer,
  [in]                DWORD        nNumberOfBytesToWrite,
  [out, optional]     LPDWORD      lpNumberOfBytesWritten,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);
  •  参数hFile

文件或设备句柄

  • 参数lpBuffer

写入数据的缓冲区指针

  • 参数nNumberOfBytesToWrote

写入文件或设备的字节数

  • 参数lpNumberOfBytesWritten

指向变量的指针,该变量接收使用同步hFile参数时写入的字节数。

  • 参数lpOverlapped

指向重叠结构的指针是 如果使用FILE_FLAG_OVERLAPPED 打开hFile参数,则为必需,否则此参数可以为NULL。

读文件

ReadFile( )函数

BOOL ReadFile(
  [in]                HANDLE       hFile,
  [out]               LPVOID       lpBuffer,
  [in]                DWORD        nNumberOfBytesToRead,
  [out, optional]     LPDWORD      lpNumberOfBytesRead,
  [in, out, optional] LPOVERLAPPED lpOverlapped
);
  • 参数hFile

设备句柄

  • 参数lpBuffer

 接收数据缓冲区的指针

  • 参数nNumberOfBytesToRead

读取的最大字节数

  • 参数lpNumberOfBytesRead

指向变量的指针,用来接收使用同步hFile参数读取的字节数。

  • 参数lpOverlapped 

重叠结构的指针,使用FILE_OVERLAPPED打开hFile参数,则为必须,否则可为NNULL

Demo示例 

写文件:

程序通过CreateFile函数打开文件,函数返回一个句柄。当使用WriteFile函数时通过该句柄向文件写入内容

void CMyFileCFileView::OnFileWrite() {
	HANDLE hFile = CreateFile(
		L"3.txt",	//要打开的文件名
		GENERIC_WRITE,	//访问方式
		0,		//共享方式
		NULL,	//安全属性
		CREATE_NEW,	//仅打开文件或设备
		FILE_ATTRIBUTE_NORMAL,//正常文件
		NULL
	);
	if (hFile == INVALID_HANDLE_VALUE) {
		TRACE("#INVALUD_HANDLE_VALUD ,errorcode = %d", GetLastError());
		return;
	}
	//写文件
	DWORD dwWrites;
	WriteFile(
		hFile,
		"Hello World",
		strlen("Hello World"),
		&dwWrites,	//用来接收实际写入到文件的字节数,有可能要求写入的和实际写入的不一样
		NULL
	);
	TRACE("#dwWrites = %d", dwWrites);
	CloseHandle(hFile);

}

读文件: 

程序通过CreateFile函数打开文件,函数返回一个句柄。当使用ReadFile函数时通过该句柄读取文件内容,并通过消息框将读取内容显示出来。


void CMyFileCFileView::OnFileRead() {
	HANDLE hFile = CreateFile(
		L"3.txt",	//要打开的文件名
		GENERIC_READ,	//访问方式
		0,		//共享方式
		NULL,	//安全属性
		OPEN_EXISTING,	//仅打开文件或设备
		FILE_ATTRIBUTE_NORMAL,//正常文件
		NULL
	); 
	DWORD dwWrites;
	char pBuf[100] = { 0 };
	ReadFile(
		hFile,
		pBuf,
		100,
		&dwWrites,	//用来接收实际写入到文件的字节数,有可能要求写入的和实际写入的不一样
		NULL
	);
	USES_CONVERSION;
	CString strBuf = A2W(pBuf);
	MessageBox(strBuf);
	CloseHandle(hFile);
}

 

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

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

相关文章

SpringSecurity(二十)---OAuth2:实现资源服务器(上)资源服务器搭建以及直接调用授权服务器模式

一、 前言 本章将讨论如何使用Spring Security实现一个资源服务器,资源服务器是管理用户资源的组件。另外,学习本章有个前提,需要先把前面搭建授权服务器的相关文章先给阅读,否则可能后面出现的授权服务器相关代码不知道个所以然…

【Redis】缓存击穿的产生情况解决方案

1. 缓存击穿产生 也叫做 热点 Key 问题,高并发访问并且缓存重建业务较复杂的 key 突然失效了,无数的请求想要重建缓存,大量的访问会在瞬间给数据库带来巨大冲击。 2. 解决方案 2.1 方案一:互斥锁 查询缓存不存在时,…

【OpenFOAM】-olaFlow-算例1- baseWaveFlume

算例路径: olaFlow\tutorials\baseWaveFlume 算例描述: 一个基础的二维波浪水槽 算例快照: 图1 波浪模拟结果图2 算例网格文件结构: ├── 0.org │ ├── U │ ├── alpha.water │ ├── alpha.water.org │ └─…

关于Redis的远程连接 Connection: Disconnect on error 问题

bug描述: Connection: Disconnect on error: Connection error: Connection timed outConnection: 192.168.245.128 > connection failed 问题复现: redis版本: redis-6.2.6 Linux版本:CenterOS 7 在linux上已经完成了red…

第五章. 可视化数据分析分析图表—常用图表的绘制1—折线图,柱形图

第五章. 可视化数据分析分析图 5.3 常用图表的绘制1—折线图,柱形图 本节主要介绍常用图表的绘制,主要包括折线图,柱形图。 1.折线图(matplotlib.pyplot.plot) 折线图可以显示随时间而变化的连续数据,适用于显示在相…

Hadoop原理与技术——hdfs命令行基本操作

一、实验目的 熟悉hdfs命令行基本操作 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内容 1:hdfs常见命令: (1)查看帮助:hdfs dfs -help (2)查看当前目录…

OpenCV图像处理——目标追踪

总目录 图像处理总目录←点击这里 二十四、目标追踪 24.1、多目标(手动检测)追踪 24.1.1、原理 目标检测:运行之后按下s,通过鼠标对某个目标进行检测,然后点击空格或者回车 目标追踪:opencv的八种追踪…

【JavaEE】JavaScript(基础语法)1

努力经营当下,直至未来明朗! 文章目录前言一、JavaScript初识(简单了解就行,没时间跳过)二、【JS的代码相关】【注释】【输入输出】三、语法1. 变量2. 【基本数据类型】THINK前言 一个人最大的痛苦就是对自己无能的愤…

信贷风控NCL净损失率的指标实现与应用

在金融信贷业务的风险控制过程中,有一项财务指标发挥着比较重要的信息参考价值,可以有效衡量某个月份放款金额在形成呆账后的资金损失情况,其中呆账指的是信贷逾期180天以上,这个指标便是NCL(Net Credit Loss&#xff…

大家都在用的福昕阅读器 foxit 你还不知道吗? 祛除水印PDF转换全功能解锁…

趣味拓展 什么字大家看了都说没用? (答案在文末) 引言 福昕阅读器是一款高级PDF编辑器,查看目录、去除水印、编辑文本、转换格式等都是可以用到的~ 小编第一次使用的时候是用来查看pdf文档目录的,当时未使用破解版,后来循序渐进…

基于PHP+MySQL中小学生科学实验展示网站的设计与实现

中小学生科学实验展示网站能够通过互联网得到广泛的、全面的宣传,让尽可能多的人积极的参加到科学实验行列中来,不仅为需要的人提供了服务,而且锻炼了自己,同时能够让中小学生对科学实验的兴趣有很大的提高 PHP中小学生科学实验展示网站是一个科普类型的网站,系统通过PHp&#…

[附源码]Python计算机毕业设计SSM客户信息管理(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

模拟电子技术(四)放大电路的频率响应

(四)放大电路的频率响应电路理论基础知识复习频率响应基本概念两个无源频率响应的单元电路波特图(幅频、相频)高、低同电路对比晶体管的高频等效模型单管放大电路的频率响应研究信号频率的变化对放大电路性能的影响也就是电路对输…

Linux零基础入门(二)Linux基础命令

Linux零基础入门(二)Linux基础命令前言Linux基础命令一 Linux的目录结构1 Linux路径的描述方式二 Linux命令入门1 Linux命令基础格式2 ls命令3 HOME目录和工作目录4 ls命令的参数ls 命令的 -a选项ls命令的 -l选项ls命令选项的组合使用ls选项和参数的组合…

基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工势场法原理是:首先构建一个人工虚拟势场,该势场由两部分组成,一部分是目标点对移动机器人产生的引力场,方向由机器人指向目标点&#xf…

C语言——malloc开辟矩阵

目录 用动态内存开辟矩阵 矩阵初始化 用动态内存开辟矩阵 动态内存更多的知识在这篇博客,本文将介绍用malloc开辟矩阵。 malloc是C语言中用来动态开辟内存的,通过malloc函数可以向计算机申请一串连续的内存空间。 因为malloc开辟的内存在堆上&#…

数据链路层-封装成帧

封装成帧 数据链路层给上层交付的协议数据单元添加上帧头和帧尾使之成为帧帧头和帧尾包含有重要的控制信息帧头和帧尾的作用之一就是帧定界 透明传输 数据链路层对上层的交付的传输数据没有任何的限制,就好像数据链路层不存在一样面向字节的物理链路使用字节填充(字…

manjaro (gnome) 记录 2 常用配置与快捷键介绍

manjaro (gnome) 记录 2 常用配置与快捷键介绍 初manjaro 记录 2 常用配置与快捷键介绍安装 vim 文本编辑器配置中文输入法安装谷歌拼音配置输入法添加快捷键:gnome 终端通过命令:gnome-terminal 可以打开 gnome 终端窗口设置快捷…

学习Hadoop(一)——搭建hadoop集群

最近开始学习大数据的相关知识,要学习大数据就不得不提到Hadoop。 一般来说学习一门新的知识,很多都是先理论再实践 我则不然,先实践,再了解理论 目录一、VM网络设置二、安装Centos72.1 网络配置2.2 设置主机名2.3 hosts设置2.4…

【在SpringBoot项目中使用Validation框架检查数据格式】

目录 1. 添加依赖 2. 检查POJO类型的请求参数 3. 关于响应的消息文本 4. 快速失败 5. 检查未封装的请求参数 1. 添加依赖 在pom.xml中添加spring-boot-starter-validation依赖项&#xff1a; <!-- Spring Boot Validation框架&#xff0c;用于检查数据格式 --> &…