Windows 程序设计7:文件的创建、打开与关闭

文章目录

  • 前言
  • 一、文件的创建与打开CreateFile
    • 1. 创建新的空白文件
    • 2. 打开已存在文件
    • 3. 打开一个文件时,如果文件存在则打开,如果文件不存在则新创建文件
    • 4.打开一个文件,如果文件存在则打开文件并清空内容,文件不存在则 新创建文件
  • 二、关闭文件句柄CloseHandle
  • 总结


前言

Windows 程序设计7:文件的创建、打开与关闭。


一、文件的创建与打开CreateFile

Windows系统中文件的创建与打开都是使用同一个API函数CreateFile。通过传递不同的参数值来表示是要创建一个新文件还是要打开一个已经存在的文件。函数原型如下:

HANDLE CreateFile(LPCTSTR                lpFileName,          // 文件名或设备名DWORD                 dwDesiredAccess,     // 访问模式DWORD                 dwShareMode,         // 共享模式LPSECURITY_ATTRIBUTES lpSecurityAttributes,// 安全属性DWORD                 dwCreationDisposition,// 创建方式DWORD                 dwFlagsAndAttributes, // 文件属性HANDLE                hTemplateFile        // 模板文件句柄
);
// 该函数用于打开文件或I/O设备,常见的I/O设备有:
// 文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、邮筒和管道等

返回值:该函数返回一个句柄,该句柄可以根据文件或设备,以及指定的标志和属性访问文件或设备以获取各种类型的I/O。如果成功,返回文件或设备的句柄;如果失败,返回 INVALID_HANDLE_VALUE。可以通过 GetLastError 获取错误代码。文件或设备的句柄就相当于其代号,有了句柄之后就可以对其进行其他操作。

参数说明:
1.参数lpFileName:LPCTSTR类型

要创建或打开的文件的路径(可以是绝对路径或相对路径)。

也可以是设备名(如 COM1、LPT1)。

2.dwDesiredAccess:DWORD类型

指定对文件的访问权限,创建或打开这个文件之后我们要对这个文件干什么,就赋予相应的权限。常见值:

GENERIC_READ:读取权限。

GENERIC_WRITE:写入权限。

GENERIC_READ | GENERIC_WRITE:读写权限。
0:不希望从设备读取数据或向设备传入数据

3.dwShareMode:DWORD类型

指定文件的共享模式。常见值:

FILE_SHARE_READ:允许其他进程读取文件。

FILE_SHARE_WRITE:允许其他进程写入文件。

FILE_SHARE_DELETE:允许其他进程删除文件。

0:独占访问,不允许其他进程访问。

4.lpSecurityAttributes:LPSECURITY_ATTRIBUTES类型

指向 SECURITY_ATTRIBUTES 结构的指针,用于设置文件的安全属性。

通常设置为 NULL,表示使用默认安全属性。

5.dwCreationDisposition:DWORD类型

指定文件存在或不存在时的操作。常见值:

CREATE_NEW:创建新文件,如果文件已存在则失败。

CREATE_ALWAYS:创建新文件,如果文件已存在则覆盖。

OPEN_EXISTING:打开现有文件,如果文件不存在则失败。

OPEN_ALWAYS:打开文件,如果文件不存在则创建。

TRUNCATE_EXISTING:打开文件并将其截断为 0 字节(清空文件内容),如果文件不存在则失败。

6.dwFlagsAndAttributes:DWORD类型

指定文件属性和标志。允许我们设置一些标志来微调与设备之间的通信,如果设备是一个文件,还能够设置文件的属性。常见值:

FILE_ATTRIBUTE_NORMAL:普通文件,无特殊属性。

FILE_ATTRIBUTE_HIDDEN:隐藏文件。

FILE_ATTRIBUTE_READONLY:只读文件。

FILE_FLAG_DELETE_ON_CLOSE:文件关闭后自动删除。

FILE_FLAG_OVERLAPPED:启用异步 I/O。

7.hTemplateFile:HANDLE类型

指向模板文件的句柄。通常设置为 NULL,用的不是很多。

1. 创建新的空白文件

在D盘下创建一个"新年快乐.txt"文件,即读又写的权限,在使用时其他程序可以以读的权限打开,无其他特殊属性。

	HANDLE handle1 = CreateFile(_T("D:\\新年快乐.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (handle1 != INVALID_HANDLE_VALUE) // 函数执行成功{MessageBox(NULL, _T("文件成功创建"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("文件没有成功创建"), _T("提示"), MB_OK)}

运行后文件创建成功
在这里插入图片描述
D盘内也出现了该文件
在这里插入图片描述
在这里插入图片描述

2. 打开已存在文件

接下来使用CreateFile打开上述创建的文件

	HANDLE handle1 = CreateFile(_T("D:\\新年快乐.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (handle1 != INVALID_HANDLE_VALUE) // 函数执行成功{MessageBox(NULL, _T("文件成功打开"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("文件没有成功打开"), _T("提示"), MB_OK)}

运行后提示文件打开
在这里插入图片描述

如果我们将这个文件重命名,则D盘内不存在“新年快乐.txt”
在这里插入图片描述
此时运行则无法打开文件
在这里插入图片描述
利用GetLastError()函数可以看到错误码为2,即系统找不到指定文件。
在这里插入图片描述
GetLastError()的相关用法见GetLastError相关用法

3. 打开一个文件时,如果文件存在则打开,如果文件不存在则新创建文件

上述打开一个不存在的文件时,直接无法打开。这里实现打开一个不存在的文件时,创建该文件

	HANDLE handle1 = CreateFile(_T("D:\\新年快乐.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (handle1 != INVALID_HANDLE_VALUE) // 函数执行成功{MessageBox(NULL, _T("文件成功打开"), _T("提示"), MB_OK);}else{DWORD dwerror = GetLastError();MessageBox(NULL, _T("文件没有成功打开"), _T("提示"), MB_OK);}

可以看见新创建了一个“新年快乐.txt”
在这里插入图片描述
并将文件打开了
在这里插入图片描述

4.打开一个文件,如果文件存在则打开文件并清空内容,文件不存在则 新创建文件

然后,实现打开一个文件,如果文件存在则打开并清空内容,文件不存在则新创建文件
先在D盘中的“新年快乐.txt”中输入一些内容
在这里插入图片描述
代码只需要将上述的OPEN_ALWAYS换为CREATE_ALWAYS即可
运行后文件内容被清空了
在这里插入图片描述

二、关闭文件句柄CloseHandle

CloseHandle的函数原型如下,本质上是关闭刚刚利用CreateFile打开的文件的句柄。

BOOL CloseHandle(HANDLE hObject  // 要关闭的句柄
);

CloseHandle函数关闭一个内核对象,其中包括文件、文件映射、线程、安全和同步对象等等。
在CreateThread成功之后会返回一个hThread的线程句柄,且内核对象计数+1,CloseHandle之后,引用计数-1,当变为0时,系统删除该内核对象。

若在线程执行之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露。这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出之后,系统会自动清理这些资源。

参数:HANDLE hObject代表一个已经打开的对象句柄,例如文件句柄、线程句柄、进程句柄等。

返回值:布尔类型,TRUE表示函数执行成功;FALSE表示函数执行失败,可以利用GetLastError获得错误码。

简单使用时按图示进行使用即可

在这里插入图片描述


总结

Windows 程序设计7:文件的创建、打开与关闭。

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

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

相关文章

FastReport.NET控件篇之富文本控件

简介 FastReport.NET 提供了 RichText 控件,用于在报表中显示富文本内容。富文本控件支持多种文本格式(如字体、颜色、段落、表格、图片等),非常适合需要复杂排版和格式化的场景。 富文本控件(RichText)使用场景不多&#xff0c…

爬虫基础(三)Session和Cookie讲解

目录 一、前备知识点 (1)静态网页 (2)动态网页 (3)无状态HTTP 二、Session和Cookie 三、Session 四、Cookie (1)维持过程 (2)结构 正式开始说 Sessi…

PythonFlask框架

文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…

002-基于Halcon的图像几何变换

本节将简要介绍Halcon中有关图像几何变换的基本算子及其应用,主要涉及五种常见的二维几何变换形式:平移、镜像、旋转、错切和放缩。这几种变换可归结为一类更高级更抽象的空间变换类型,即仿射变换(Affine transformation&#xff…

Hive:日志,hql运行方式,Array,行列转换

日志 可以在终端通过 find / | grep hive-log4j2 命令查找Hive的日志配置文件 这些文件用于配置Hive的日志系统。它们不属于系统日志也不属于Job日志,而是用于配置Hive如何记录系统日志和Job日志, 可以通过hive-log4j2 查找日志的位置 HQL的3种运行方式 第1种就是l…

SpringBoot使用MockMVC通过http请求controller控制器调用测试

说明 在Spring Boot中编写测试控制器调用是一个常见的需求,通常使用Spring的测试框架来完成。Spring Boot提供了多种方式来测试控制器,包括使用MockMvc进行模拟HTTP请求和响应的测试。 基本示例 1. 创建Spring Boot项目 首先,确保你已经创建了一个Spring Boot项目。如果…

Spring集成Redis|通用Redis工具类

一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …

Unity 粒子特效在UI中使用裁剪效果

1.使用Sprite Mask 首先建立一个粒子特效在UI中显示 新建一个在场景下新建一个空物体,添加Sprite Mask组件,将其的Layer设置为UI相机渲染的UI层, 并将其添加到Canvas子物体中,调整好大小,并选择合适的Sprite&#xff…

[C语言日寄] <stdio.h> 头文件功能介绍

在C语言的世界里&#xff0c;<stdio.h> 是一个极其重要的头文件&#xff0c;它提供了标准输入输出功能&#xff0c;是C语言程序与用户交互的核心工具。今天&#xff0c;我们就来深入探讨 <stdio.h> 的功能、使用注意事项以及它的拓展应用。 功能介绍 <stdio.h…

【实践案例】使用Dify构建企业知识库

文章目录 背景知识检索增强生成&#xff08;RAG&#xff09;向量检索关键词检索混合检索向量化和相似度计算实例说明 实践案例创建知识库Rerank 模型设置创建Dify工作流测试 背景知识 检索增强生成&#xff08;RAG&#xff09; 检索增强生成&#xff08;Retrieval-Augmented …

Maui学习笔记- SQLite简单使用案例02添加详情页

我们继续上一个案例&#xff0c;实现一个可以修改当前用户信息功能。 当用户点击某个信息时&#xff0c;跳转到信息详情页&#xff0c;然后可以点击编辑按钮导航到编辑页面。 创建项目 我们首先在ViewModels目录下创建UserDetailViewModel。 实现从详情信息页面导航到编辑页面…

算法基础学习——快排与归并(附带java模版)

快速排序和归并排序是两种速度较快的排序方式&#xff0c;是最应该掌握的两种排序算法&#xff0c; &#xff08;一&#xff09;快速排序&#xff08;不稳定的&#xff09; 基本思想&#xff1a;分治 平均时间复杂度&#xff1a;O(nlogn) / 最慢O(n^2) / 最快O(n) 步骤&…

MySQL 基础学习(3):排序查询和条件查询

MySQL 查询与条件操作&#xff1a;详解与技巧 在本文中&#xff0c;我们将探讨 MySQL 中的查询操作及其相关功能&#xff0c;包括别名、去重、排序查询和条件查询等&#xff0c;并总结一些最佳实践和注意事项。 一、使用别名&#xff08;AS&#xff09; 在查询中&#xff0c…

数据结构的队列

一.队列 1.队列&#xff08;Queue&#xff09;的概念就是先进先出。 2.队列的用法&#xff0c;红色框和绿色框为两组&#xff0c;offer为插入元素&#xff0c;poll为删除元素&#xff0c;peek为查看元素红色的也是一样的。 3.LinkedList实现了Deque的接口&#xff0c;Deque又…

1. Java-MarkDown文件创建-工具类

Java-MarkDown文件创建-工具类 1. 思路 根据markdown语法&#xff0c;拼装markdown文本内容 2. 工具类 import java.util.Arrays; import java.util.List;/*** Markdown生成工具类* Author: 20004855* Date: 2021/1/15 16:00*/ public class MarkdownGenerator {private Str…

Go学习:格式化输入输出

目录 1. 输出 2. 输入 1. 输出 常用格式&#xff1a; 格式说明%d整型格式%s字符串格式%c字符格式%f浮点数格式%T操作变量所属类型%v自动匹配格式输出 简单示例代码&#xff1a; package mainimport "fmt"func main() {a : 10b : "abc"c : ad : 3.14/…

回顾:Maven的环境搭建

1、下载apache-maven-3.6.0 **网址:**http://maven.apache.org 然后解压到指定的文件夹&#xff08;记住文件路径&#xff09; 2、配置Maven环境 复制bin文件夹 的路径D:\JavaTool\apache-maven-3.6.0\bin 环境配置成功 3、检查是否配置成功 winR 输入cmd 命令行输入mvn -v…

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析

在Windows系统中&#xff0c;你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效&#xff0c;如图&#xff1a; 你可以使用以下代码&#xff1a; import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …

解决报错“The layer xxx has never been called and thus has no defined input shape”

解决报错“The layer xxx has never been called and thus has no defined input shape”(这里写自定义目录标题) 报错显示 最近在跑yolo的代码时遇到这样一个错误&#xff0c;显示“the layer {self.name} has never been called”.这个程序闲置了很久&#xff0c;每次一遇到…

UE(UltraEdit) 配置简易C/C++编译运行环境

该类型其他帖子 EmEditor 配置简易C/C 编译运行环境_emeditor 代码运行-CSDN博客 RJ TextEd 配置简易C/C 编译运行环境-CSDN博客 这种配置适合ACM竞赛&#xff0c;即要求不使用现代IDE&#xff0c;又想用一个比较好用、至少支持代码高亮的编辑器。 前提条件 1.Mingw GCC 已…