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

Windows系统编程 - 目录操作、磁盘、卷信息

前言

  • 各位师傅大家好,我是qmx_07,今天继续讲解Windows系统编程的相关知识:目录操作
    在这里插入图片描述

目录

目录操作

创建目录
  • 通过CreateDirectory函数创建目录
    原型:
BOOL CreateDirectoryA(
  [in]           LPCSTR                lpPathName,//目录名称
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性,对目录的访问权限,NULL表示默认的安全属性
);

在这里插入图片描述

删除目录
  • 使用RemoveDirectory函数删除目录
    RemoveDirectory(源文件)
    在这里插入图片描述

  • 注意:使用该函数只能删除空目录,如果该目录有文件,遍历删除文件,再使用该函数

遍历目录文件(模仿dir命令)

WIN32_FIND_DATA
  • 一般使用_WIN32_FIND_DATA来存储文件的信息,下面了解一下存储了哪些内容:
typedef struct _WIN32_FIND_DATA {
  DWORD    dwFileAttributes;//文件属性 比如是文件,或者是目录
  FILETIME ftCreationTime;//文件目录的创建时间
  FILETIME ftLastAccessTime;//最后的访问时间
  FILETIME ftLastWriteTime;//最后的写入时间
  DWORD    nFileSizeHigh;//存储的高位DWORD
  DWORD    nFileSizeLow;//存储的低位DWORD
  DWORD    dwReserved0;//保留内容
  DWORD    dwReserved1;//保留内容
  CHAR     cFileName[MAX_PATH];//文件名称
  CHAR     cAlternateFileName[14];//文件备用名称
  }
  • 文件名称、创建时间、最近的读取、写入时间、文件大小等数据
时间戳及转换

在这里插入图片描述

  • 我们使用FindFirstFile函数查找qmx.ini文件,将数据存储到FindFileData中,打印文件名称和创建时间
  • 但是可以观察到 创建时间是一堆数字,并不能直接看到日期

时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(不考虑闰秒),用于表示一个时间点

在这里插入图片描述
需要使用SYSTEMTIMEFileTimeToSystemTime函数,来进行转换日期

SYSTEMTIME 和 FileTimeToSystemTime
typedef struct _SYSTEMTIME {
  WORD wYear;//年
  WORD wMonth;//月
  WORD wDayOfWeek;//星期
  WORD wDay;//天
  WORD wHour;//小时
  WORD wMinute;//分钟
  WORD wSecond;//秒钟
  WORD wMilliseconds;//毫秒
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
BOOL FileTimeToSystemTime(
  [in]  const FILETIME *lpFileTime,//FileTime的指针,也就是时间戳
  [out] LPSYSTEMTIME   lpSystemTime//SystemTime指针,用来将时间戳转换到日期存储
);
  • 使用FileTimeToSystemTime函数将时间戳存储到SYSTEMTIME中,将时间戳转换成年月日时分秒,以此来打印数据
文件常量类型

在这里插入图片描述

  • 这些是常用到的文件类型
实现
	WIN32_FIND_DATA FindFileData;
	HANDLE hFile = FindFirstFile("G:\\win_file\\test\\*", &FindFileData);
	if (INVALID_HANDLE_VALUE == hFile)
	{
		std::cout << "FindFirstFile Faild" << std::endl;
		std::cout << GetLastError() << std::endl;
	}
	do
	{
		SYSTEMTIME SystemTime;
		FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);
		std::cout << SystemTime.wYear << "-" << SystemTime.wMonth<<"-"<<SystemTime.wDay<<" ";
		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			std::cout << "<DIR>" <<  " ";
		}
		std::cout << FindFileData.cFileName << std::endl;

	} while (FindNextFile(hFile, &FindFileData));
	
  • 逻辑:通过遍历目录文件,依次打印时间,文件名称
  • FindNextFile用来查找下一个文件
  • FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY 判断文件是否是目录
  • 画面演示:
    在这里插入图片描述

	CHAR VolumeName[MAX_PATH] = { 0 };//用于存储卷的名称
	DWORD VolumeSerialNum;//存储卷的序列号
	DWORD MaxComponentLength;//存储文件名的最大长度
	DWORD SysFlags;//卷的特性信息
	CHAR FileSystem[MAX_PATH] = { 0 };//存储文件系统名称
	GetVolumeInformation("D:\\", VolumeName, MAX_PATH, &VolumeSerialNum, &MaxComponentLength,&SysFlags, FileSystem,MAX_PATH);

在这里插入图片描述

  • GetVolumeInformation函数用于获取卷信息

磁盘

BOOL GetDiskFreeSpaceA(
  [out] LPDWORD lpSectorsPerCluster,//用于获取指定磁盘卷中每个簇包含的扇区数量
  [out] LPDWORD lpBytesPerSector,//用于获取指定磁盘卷中每个扇区包含的字节数
  [out] LPDWORD lpNumberOfFreeClusters,//用于获取指定磁盘卷中当前空闲的簇的数量
  [out] LPDWORD lpTotalNumberOfClusters//用于获取指定磁盘卷中总的簇的数量
);
  • lpSectorsPerCluster * lpBytesPerSector 空闲空间大小 = 空闲簇数量 × 簇大小
  • lpSectorsPerCluster和lpBytesPerSector 计算磁盘总大小

总结

  • 学习了目录的相关知识 了解 时间戳 遍历文件 模拟dir命令、以及卷,磁盘 使用windows api查看相关信息

http://www.kler.cn/news/343248.html

相关文章:

  • 招联金融2025秋招内推
  • 【Android】Handler消息机制
  • 反向指标KDJ?只要做个简单的魔改,就能一直在新高路上!
  • 玩机进阶教程----MTK芯片机型修改串码IMEI 修改MEID 修改序列号步骤详细演示 总结【二】
  • 如何推导“求算数平方根”的递推公式
  • Oracle 数据库启动及其他常用组件启动命令汇总
  • 动态规划算法——三步问题
  • 泊松流公式及相关概念
  • Golang | Leetcode Golang题解之第467题环绕字符串中唯一的子字符串
  • ToSpeak
  • 【Linux】进程间通信——System V消息队列和信号量
  • 智能家居系统及其对现代生活的影响
  • OpenCV高级图形用户界面(1)创建滑动条函数createTrackbar()的使用
  • 【Kubernetes】常见面试题汇总(五十八)
  • 大模型应用探讨,免费AI写作、一键PPT、免费PDF百种应用、与AI对话
  • TypeScript面向对象 02
  • 凡事预则立,不预则废
  • QT中的信号槽
  • 游戏开发指南:使用 UOS C# 云函数快速构建与部署服务端逻辑实战教学
  • 【VUE】Vue2与Vue3中的双向数据绑定