当前位置: 首页 > news >正文

Windows程序设计10:文件指针及目录的创建与删除

文章目录

  • 前言
  • 一、文件指针是什么?
  • 二、设置文件指针的位置:随机读写,SetFilePointer函数
    • 1.函数说明
    • 2.函数实例
  • 三、 目录的创建CreateDirectory
  • 四、目录的删除RemoveDirectory
  • 总结


前言

Windows程序设计10:文件指针及目录的创建与删除。


一、文件指针是什么?

文件指针主要用于文件的读和写。打开一个文件后,默认就与之产生了一个内部的记录文件位置的指针,用于指示当前的读写位置。当进行了文件的读写操作后,指针会自动往后移动。读写了多少字节,就会往后移动多少字节。默认情况下可能我们也不需要关心文件的指针,因为文件的指针位置都是默认自动控制的。当你想要从一个文件的指定位置进行读写的时候就需要用到文件指针。如大文件的断点续传形式下载。

二、设置文件指针的位置:随机读写,SetFilePointer函数

1.函数说明

函数原型如下

DWORD SetFilePointer(HANDLE hFile,                  // 文件句柄LONG  lDistanceToMove,         // 要移动的距离(低 32 位)PLONG lpDistanceToMoveHigh,    // 要移动的距离(高 32 位)DWORD dwMoveMethod             // 移动的起始位置
);

参数 HANDLE hFile为文件句柄,必须是通过 CreateFile 打开的句柄。句柄必须具有 GENERIC_READ 或 GENERIC_WRITE 访问权限。

参数LONG lDistanceToMove为要移动的距离(低 32 位)。如果 lpDistanceToMoveHigh 为 NULL,则这是一个有符号的 32 位值。

PLONG lpDistanceToMoveHigh指向一个 LONG 变量的指针,用于指定要移动的距离(高 32 位)。如果为 NULL,则文件指针移动范围限制在 32 位。

DWORD dwMoveMethod指定文件指针移动的起始位置。可以是以下值之一:FILE_BEGIN:从文件开头开始移动。FILE_CURRENT:从当前位置开始移动。FILE_END:从文件末尾开始移动。

返回值:如果函数执行成功,返回文件指针的新位置(低 32 位)。如果函数执行失败,返回 INVALID_SET_FILE_POINTER。可以通过 GetLastError 获取错误代码。注意:高32位的值通过参数PLONG lpDistanceToMoveHigh传出。

2.函数实例

与之前一样,写入如下数据

			// 写入数据// 写入一个数字int num = 12345; // 写入的数据DWORD rw = 0; // 传出的实际写入大小bret = WriteFile(handle1, &num, sizeof(num), &rw, NULL);// 写入一个字母char ch = 'A';bret = WriteFile(handle1, &ch, sizeof(ch), &rw, NULL);// 写入包含中文的字符串char st[32] = "abc要好好学习!";bret = WriteFile(handle1, st, sizeof(st), &rw, NULL);if (bret){MessageBox(NULL, _T("数据写入成功"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("数据写入失败"), _T("提示"), MB_OK);}CloseHandle(handle1);}

则文件中数据为
在这里插入图片描述
想要实现直接读取字符串“abc要好好学习”,即略过前面的数字123345和字符A进行读取。

	handle1 = CreateFile(_T("D:\\新年快乐.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (handle1 != INVALID_HANDLE_VALUE) // 函数执行成功{// 读取数字DWORD readw = 0;// 移动文件指针位置SetFilePointer(handle1, sizeof(int) + sizeof(char), NULL, FILE_BEGIN);// 读取字符串char read_str[32] = { 0 };bret = ReadFile(handle1, read_str, sizeof(read_str), &readw, NULL);if (bret){MessageBox(NULL, _T("数据读入成功"), _T("提示"), MB_OK);}else{MessageBox(NULL, _T("数据读入失败"), _T("提示"), MB_OK);}CloseHandle(handle1);}else{DWORD dwerror = GetLastError();MessageBox(NULL, _T("文件没有成功打开"), _T("提示"), MB_OK);}

可以看到读取成功
在这里插入图片描述
上述代码是从文件开头向后移动,移动了一个int和一个char这么多的距离,下面演示一下从文件末尾向前移动,移动那么就需要移动字符串这么多的距离。这里设置字符串长度为32字节,因此只需要更改SetFilePointer这行代码

SetFilePointer(handle1, -32, NULL, FILE_END);

同样能够正确读取字符串
在这里插入图片描述

三、 目录的创建CreateDirectory

用于创建单一层级的目录。建立多层级目录需要使用函数MakeSureDirectoryPathExists。这里只介绍CreateDirectory,函数原型如下

BOOL CreateDirectory(LPCTSTR               lpPathName,          // 目录路径LPSECURITY_ATTRIBUTES lpSecurityAttributes // 安全属性
);

参数LPCTSTR lpPathName为要创建的目录的路径。可以是绝对路径或相对路径。
参数LPSECURITY_ATTRIBUTES lpSecurityAttributes指向 SECURITY_ATTRIBUTES 结构的指针,用于设置目录的安全属性。如果为 NULL,则使用默认安全属性。

返回值:如果成功,返回 TRUE。如果失败,返回 FALSE。可以通过 GetLastError 获取错误码。

以在D盘下创建一个学习C++的文件夹为例

CreateDirectory(_T("D://学习C++"), NULL);

文件夹创建成功
在这里插入图片描述
在这里插入图片描述
但是连续创建子文件夹就会出现问题,删掉刚刚创建的“学习C++”文件夹后运行如下代码

	BOOL bret = CreateDirectory(_T("D:\\学习C++\\123"), NULL);if (!bret){int err = GetLastError();}

可以看到err错误码为3
在这里插入图片描述
错误码3对应的问题为
在这里插入图片描述
这就是上述建立多层级目录不可以使用CreateDirectory。

四、目录的删除RemoveDirectory

删除一个现有的不包含任何文件的空目录,要删除非空目录需要调用SHFileOperation。这里只介绍RemoveDirectory,函数声明为

BOOL RemoveDirectory(LPCTSTR lpPathName  // 目录路径
);

参数LPCTSTR lpPathName为要删除的目录的路径。可以是绝对路径或相对路径。路径的最大长度为 MAX_PATH(260 个字符)。

返回值:如果函数执行成功,返回 TRUE。如果失败,返回 FALSE。可以通过 GetLastError 获取错误码。

删除D盘下的“学习C++”文件夹,文件夹内部还有一个子文件夹123。
在这里插入图片描述
代码如下

	// 删除文件目录BOOL bret_re = RemoveDirectory(_T("D:\\学习C++"));if (!bret_re){int err = GetLastError();}

函数执行失败,错误码为145
在这里插入图片描述
对应的问题为
在这里插入图片描述
这就是由于存在子文件夹导致的,如果不包含子目录
在这里插入图片描述
则此时上述代码运行成功,D盘内的文件夹“学习C++”成功删除。


总结

Windows程序设计10:文件指针及目录的创建与删除。

相关文章:

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…...

geolocator包的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码4 体验分享 我们在上一章回中介绍了如何实现滑动菜单相关的内容,本章回中将介绍如何获取位置信息.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的获取位置信息本质上是获取当前手机所在位置的…...

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

22.Word:小张-经费联审核结算单❗【16】

目录 NO1.2 NO3.4​ NO5.6.7 NO8邮件合并 MS搜狗输入法 NO1.2 用ms打开文件,而不是wps❗不然后面都没分布局→页面设置→页面大小→页面方向→上下左右:页边距→页码范围:多页:拼页光标处于→布局→分隔符:分节符…...

Agent 高频知识汇总:查漏补缺参考大全

Agent 高频问题汇总 一、基础概念类 (一)请解释 Agent 的概念及其主要特点 Agent 是一种能够感知所处环境,并基于感知信息做出决策、采取行动以实现特定目标的实体。它既可以是简单的规则基系统,也能是复杂的智能体&#xff0c…...

本地化部署DeepSeek-R1

本文环境搭建均基于免费工具,感谢开源。 一、下载工具并安装 1. Ollama:最新版本 0.5.7 官网在这里 https://ollama.com/download 但是下载太慢,得换个思路 https://sourceforge.net/projects/ollama.mirror/ 2.Chatbox https://cha…...

验证二叉搜索数(98)

98. 验证二叉搜索树 - 力扣(LeetCode) 解法: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* …...

StarRocks BE源码编译、CLion高亮跳转方法

阅读SR BE源码时,很多类的引用位置爆红找不到,或无法跳转过去,而自己的Linux机器往往缺乏各种C依赖库,配置安装比较麻烦,因此总体的思路是通过CLion远程连接SR社区已经安装完各种依赖库的Docker容器,进行编…...

数模测评:doubao1.5>deepseek-v3>gpt-o1

本次测试了当前评价最高的三款大模型doubao1.5、gpt-o1、deepseek-v3(r1崩溃),都是采用无提示词的硬核提问方式,测试视频如下。 gpto1、doubao1.5、deepseek测评 测试方式: 上传美赛六道题目文件 直接提问以下5句话: 这是一道数学…...

晴,初三,年已过

既然直播如此影响情绪,为什么还要直播?因为无聊?明明那么多事情可以打发时间。 真不想懂。 今日初三,昨天晚上小舅家聚,今天大舅家聚,计划明天小姨妈家聚。 今晚喝了点大舅哥哥泡的白葡萄酒,…...

Vue3 v-bind 和 v-model 对比

1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...

Smalltalk语言是何物?面向对象鼻祖Simula的诞生?Simula和Smalltalk有什么区别?面向对象设计?

Smalltalk语言是何物? Smalltalk语言的前身可以追溯到Flex系统&#xff0c;这是由Alan Kay最早提出的。在随后的发展中&#xff0c;Smalltalk逐渐演化&#xff0c;并出现了Smalltalk-72和Smalltalk-76等版本。最终&#xff0c;在经过近10年的研究与发展后&#xff0c;Xerox研究…...

KVM/ARM——基于ARM虚拟化扩展的VMM

1. 前言 ARM架构为了支持虚拟化做了些扩展&#xff0c;称为虚拟化扩展(Virtualization Extensions)。原先为VT-x创建的KVM(Linux-based Kernel Virtual Machine)适配了ARM体系结构&#xff0c;引入了KVM/ARM (the Linux ARM hypervisor)。KVM/ARM没有在hypervisor中引入复杂的…...

Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher

Docker可视化工具对比分析&#xff0c;Docker Desktop&#xff0c;Portainer&#xff0c;Rancher Windows系统中Docker可视化工具对比分析1. 工具概览2. Docker Desktop官网链接&#xff1a;主要优点&#xff1a;主要缺点&#xff1a;版本更新频率&#xff1a; 3. Portainer官网…...

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…...

算法【完全背包】

完全背包与01背包的区别仅在于每种商品可以选取无限次。时间复杂度O(物品数量 * 背包容量) 下面通过题目加深理解。 题目一 测试链接&#xff1a;疯狂的采药 - 洛谷 分析&#xff1a;这是一道完全背包的模板题。对于第i个物品的可能性展开也有两种&#xff0c;第一种是不取第…...

二叉树的遍历

有一个结点的二叉树。给出每个结点的两个子结点编号&#xff0c;建立一棵二叉树&#xff0c;如果是叶子结点&#xff0c;则输入 0 0。 建好树这棵二叉树之后&#xff0c;依次求出它的前序、中序、后序列遍历。 输入格式: 第一行一个整数n &#xff0c;表示结点数。 之后n 行…...

1.31 实现五个线程的同步

1.使用互斥锁实现 1>程序代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include &l…...

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…...

【开源免费】基于SpringBoot+Vue.JS体育馆管理系统(JAVA毕业设计)

本文项目编号 T 165 &#xff0c;文末自助获取源码 \color{red}{T165&#xff0c;文末自助获取源码} T165&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

麒麟系统使用-进行.NET开发

文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的&#xff0c;如果需要进行.NET开发&#xff0c;则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET&#xff0c;所以要进…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...