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:文件指针及目录的创建与删除。

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

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

相关文章

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化: 信任是我们最宝贵的资产。而现在,它正像黑色星期五促销的廉价平板电视一样,被一点点拆解。在过去,世界很简单:人们相信晚间新闻、那些满是灰尘书籍的教授,或者手持病历、眉头紧锁的医生。而如…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

1-刷力扣问题记录

25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

无用知识研究:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

Jupyterlab和notebook修改文件的默认存放路径的方法

文章目录 1.缘由2.操作流程2.1找到默认的路径2.2创建配置文件2.3修改配置文件内容2.4注意事项 1.缘由 我自己使用jupyterlab的时候,打开是在这个浏览器上面打开的,但是这个打开的文件路径显示的是C盘上面路径,所以这个就很麻烦,因…

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…

音标-- 02-- 重音 音节 变音

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 国际音标1.重音2.音节3.变音 国际音标 1.重音 2.音节 3.变音

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的,是一家日本AI公司SakanaAI的论文(我以前写过他们的不训练提升模型的能力的文章,感兴趣可以去翻)它家有Lion Jones坐镇…

优化代码性能:利用CPU缓存原理

在计算机的世界里,有一场如同龟兔赛跑般的速度较量,主角便是 CPU 和内存 。龟兔赛跑的故事大家都耳熟能详,兔子速度飞快,乌龟则慢吞吞的。在计算机中,CPU 就如同那敏捷的兔子,拥有超高的运算速度&#xff0…

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …

分库分表技术方案选型

一、MyCat 官方网站&#xff0c;技术文档 MyCat是一款由阿里Cobar演变而来的用于支持数据库读写分离、分片的数据库中间件。它基于MySQL协议&#xff0c;实现了MySQL的协议和能力&#xff0c;并作为代理层位于应用和数据库之间&#xff0c;可以隐藏底层数据库的复杂性。 原理…

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …

IBM DB2常用命令(windows版),包含建库、建表、增删改查等命令

安装IBM DB2可以参考我上篇博客&#xff1a;IBM Db2 & IBM Db2 Data Management Console(可视化管理工具)的下载与安装&#xff08;简洁版&#xff09;-CSDN博客 使用管理员权限打开cmd窗口 G: cd G:\IBM\SQLLIB\BIN db2cmd首先&#xff0c;在服务端需要配置好服务名、监…

Flutter Scaffold 页面结构

Material是一套设计风格&#xff0c;提供了大量的小部件&#xff0c;这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…