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

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.kler.cn/a/527148.html

相关文章:

  • python 语音识别
  • 数据结构 前缀中缀后缀
  • C#,入门教程(13)——字符(char)及字符串(string)的基础知识
  • stm32控制直流电机程序
  • C#面试常考随笔4:int? 和 int的区别,以及int?的运用场景?
  • Sqoop源码修改:增加落地HDFS文件数与MapTask数量一致性检查
  • 【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解
  • CSS 图像、媒体和表单元素的样式化指南
  • 音视频多媒体编解码器基础-codec
  • windows部署deepseek之方法(The Method of Deploying DeepSeek on Windows)
  • mysql中in和exists的区别?
  • 晴,初三,年已过
  • CPU 100% 出现系统中断 怎么解决
  • appmatrix平台(一个汇集原创web APP的平台)服务规划
  • 网络安全实战指南:攻防技术与防御策略
  • 洛谷P1572 计算分数
  • 3.7 audit审计功能说明和源码解读
  • C++中常用的十大排序方法之4——希尔排序
  • HTB:UnderPass[WriteUP]
  • 企业微信SCRM推动企业数字化转型实现高效客户管理与营销效益提升
  • 【01】共识机制
  • Java的Integer缓存池
  • Pdf to forms如何实现?如何在3分钟内将PDF自动转换为Microsoft Forms
  • labelme_json_to_dataset ValueError: path is on mount ‘D:‘,start on C
  • 《苍穹外卖》项目学习记录-Day7缓存菜品
  • pytorch图神经网络处理图结构数据