当前位置: 首页 > 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 国内…...

别再踩坑了!Ubuntu 20.04下用Docker一键编译OLLVM 4.0(附完整Dockerfile)

基于Docker的OLLVM 4.0高效编译指南&#xff1a;Ubuntu 20.04最佳实践 在移动安全与逆向工程领域&#xff0c;OLLVM作为代码混淆的黄金标准工具链&#xff0c;其环境搭建一直是开发者面临的痛点。传统源码编译方式需要处理复杂的依赖关系、版本冲突和系统污染风险&#xff0c;而…...

51单片机IO口不够用?试试用PCF8574模块驱动LCD1602,只需2根线!

51单片机IO口资源紧张&#xff1f;PCF8574模块驱动LCD1602的极致精简方案 当你用51单片机做项目时&#xff0c;是否经常遇到这样的困境&#xff1a;核心功能还没实现&#xff0c;IO口就已经捉襟见肘&#xff1f;特别是当需要连接LCD1602这类常用显示设备时&#xff0c;传统的8…...

Aider:AI结对编程实战,从原理到项目级代码编辑

1. 项目概述&#xff1a;当AI成为你的结对编程伙伴如果你是一名开发者&#xff0c;大概率经历过这样的场景&#xff1a;面对一个需要修改的复杂函数&#xff0c;你清楚地知道要做什么&#xff0c;但就是不想动手去敲那一行行重复或繁琐的代码&#xff1b;或者&#xff0c;在深夜…...

基于GPT-5.5构建智能问答系统的实现方案

概要GPT-5.5 是 OpenAI 于 2026 年 4 月发布的旗舰模型&#xff0c;Terminal-Bench 2.0 得分 82.7%&#xff0c;在 Agent 能力、多步骤自动化、工具调用等方面较前代有显著提升。该模型沿用 Chat Completions API 接口格式&#xff0c;支持文本和图像输入&#xff0c;具备 func…...

Next.js SEO优化实战:用next-seo库高效管理元标签与结构化数据

1. 项目概述&#xff1a;SEO 优化的现代 React 解决方案 如果你正在用 Next.js 开发一个需要被搜索引擎收录的网站&#xff0c;比如企业官网、博客或者电商平台&#xff0c;那么“SEO”这个词一定让你又爱又恨。爱的是&#xff0c;它意味着流量和用户&#xff1b;恨的是&#…...

如何在浏览器中高效使用微信网页版:浏览器扩展的终极解决方案

如何在浏览器中高效使用微信网页版&#xff1a;浏览器扩展的终极解决方案 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法在浏览器中直接使…...

从SVN到Git:老牌版本控制工具TortoiseSVN在2023年的生存指南与最佳实践

从SVN到Git&#xff1a;老牌版本控制工具TortoiseSVN在2023年的生存指南与最佳实践 当GitHub和GitLab成为开发者日常交流的代名词时&#xff0c;仍有许多团队在使用Subversion&#xff08;SVN&#xff09;管理代码库。这并非技术滞后&#xff0c;而是工具与场景的精准匹配——就…...

Elsevier Tracker:科研工作者必备的智能投稿状态追踪工具

Elsevier Tracker&#xff1a;科研工作者必备的智能投稿状态追踪工具 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 作为科研工作者&#xff0c;您是否曾因频繁登录Elsevier投稿系统查看审稿进度而感到疲惫&#x…...

使用taotoken后c语言项目调用大模型的延迟与稳定性实际体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用taotoken后c语言项目调用大模型的延迟与稳定性实际体验 在开发一个需要集成大模型能力的C语言桌面应用时&#xff0c;我们面临…...

魔兽争霸3终极增强插件:5分钟快速解决游戏兼容性问题

魔兽争霸3终极增强插件&#xff1a;5分钟快速解决游戏兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper WarcraftHelper是一款专为魔兽争霸3设…...