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

news2024/10/11 22:33:55

前言

  • 各位师傅大家好,我是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.coloradmin.cn/o/2206083.html

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

相关文章

ORA-01031 权限不足

目录 1. 问题描述2. 问题解决 1. 问题描述 通过PL/SQL客户端&#xff0c;使用scott账户登录后&#xff0c;创建用户时&#xff0c;提示ORA-01031. 2. 问题解决 通过 cmd sqlplus进入Oracle 通过system&#xff08;密码manager&#xff09;登录 要授权的是scott账户 gran…

Flutter包管理(三)

1、作用 在APP的实际开发过程中往往会依赖很多包&#xff0c;而这些包之间存在着交叉依赖、版本依赖&#xff0c;由开发者自己管理手动管理会非常麻烦&#xff0c;每种开发生态或编程官方会提供一些包的管理工具&#xff0c;在Flutter中我们在pubspec.yaml文件中来管理第三方依…

msvcp140.dll丢失的5个解决方法,全面解读msvcp140.dll丢失问题

msvcp140.dll文件的丢失可能会引发一系列潜在问题并对计算机系统产生多方面的影响。首先&#xff0c;这个文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。一旦丢失&#xff0c;可能会导致部分软件无法正常启…

【AI系统】AI系统的组成

AI系统的组成是实现其设计目标的基础。本文将详细介绍AI系统的各个组成部分&#xff0c;以及它们如何协同工作以支持AI应用程序的开发和运行。 I. 引言 AI系统的复杂性要求其组成不仅要关注单一的硬件或软件&#xff0c;而是需要一个多层次、多维度的架构设计。这包括从应用与…

JavaWeb三大组件之Servlet

1. Servlet 一、Servlet介绍 1、概念 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成…

链表(3)_重排链表_面试题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 链表(3)_重排链表_面试题 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题…

Word排版 | 如何文字部分固定行距、图片(嵌入型)单倍行距

问题描述 在写一个要求比较高的项目报告&#xff0c;总共有109页 89张图片&#xff0c;而且必须用word写 因此&#xff1a; 文字部分需要固定行距23磅图片部分需要单倍行距&#xff08;不然无法使用嵌入式&#xff09; 难点 文字和图片难以有效分离&#xff0c;无法分别设…

Redis分布式锁-秒杀类锁不住及各种因为锁导致的“血案”现场全侦破代码详解

背景 继上文“详解Redis分布式锁在SpringBoot的Async方法中没锁住的坑”不少读者发觉用了我的方法还是在并发的情况下有锁不住&#xff01; 于是我和几个没有锁住的读者了解了它们的场景&#xff0c;才知道他们在认知上存在几个误区&#xff0c;同时也发现这一块内容、知识真…

【Docker】06-DockerCompose

1. Docker compose 2. Docker Compose部署项目 docker-compose.yml version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3307:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/root/docker/mysql/…

【GESP】C++一级练习BCQM3037,简单计算,国庆七天乐收官

又回到了简单计算的题目&#xff0c;继续巩固练习。 题解详见&#xff1a;https://www.coderli.com/gesp-1-bcqm3037/ 【GESP】C一级练习BCQM3037&#xff0c;简单计算&#xff0c;国庆七天乐收官 | OneCoder又回到了简单计算的题目&#xff0c;继续巩固练习。https://www.cod…

Windows 部署 ollama

1.安装 官方地址&#xff1a;https://ollama.com/ 1.1 下载ollama 1.2 安装 1.3 运行 Ollama 1.4 测试ollama运行状态 http://localhost:11434 curl http://localhost:11434/api/generate -d "{ \"model\": \"qwen2:0.5b\", \"prompt\":…

深入理解 Java HashMap 的 get() 方法及其相关实现

在 Java 中&#xff0c;HashMap 是一个非常常用的数据结构&#xff0c;用于存储键值对。它提供了快速的查找、插入和删除操作。HashMap 的核心功能之一是根据键获取对应的值&#xff0c;这主要通过 get() 方法来实现。本文将详细介绍 HashMap 的 get() 方法及其相关的辅助方法&…

初中数学网上考试系统的设计与实现(论文+源码)_kaic

初中数学网上考试系统的设计与实现 学生&#xff1a; 指导教师&#xff1a; 摘 要&#xff1a;科技在人类的历史长流中愈洗愈精&#xff0c;不仅包括人们日常的生活起居&#xff0c;甚至还包括了考试的变化。之前的考试需要大量的时间和精力&#xff0c;组织者还需要挑选并考查…

【大模型部署】本地运行自己的大模型--ollama

ollama简介 ollama是一款开源的、轻量级的框架&#xff0c;它可以快速在本地构建及运行大模型&#xff0c;尤其是一些目前最新开源的模型&#xff0c;如 Llama 3, Mistral, Gemma等。 官网上有大量已经开源的模型&#xff0c;部分针对性微调过的模型也可以选择到&#xff0c;…

Shell脚本linux登录自动检查

.bashrc 用于设置用户的 Bash shell 环境&#xff0c;在每次打开一个新的终端窗口或启动一个新的 Bash 会话时被执行 代码 login_check.sh #!/bin/bash clear LogFileNamepolling.$(date %F-%T) EchoFormat$(for (( i0; i<30; i )); do echo -n ""; done)# 显示…

死磕P7:JVM性能调优必知必会(二)

这是「死磕P7」系列第 008 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 接上篇&#xff0c;性能优化工具&#xff0c;尤其是图形化工具&#xff0c;绝对有 VisualVM 的一席之地&#xff0c;因为它几乎囊…

【Node.js】图片水印

上传时加水印 用户上传原始图片->服务器&#xff1a;保留原始图片以及水印图片动态水印 用户上传原始图片->服务器&#xff1a;只保留原始图片 请求图片时&#xff0c;服务器动态加水印 根据业务需求自行更改操作&#xff0c;下面只讲最简单的给图片加水印。 主要使用到…

遨游智能终端赋能“危急特”场景,力推北斗技术规模化应用!

随着《北斗规模应用三年行动计划&#xff08;2023-2025&#xff09;》的发布&#xff0c;北京、湖北、重庆等多地出台北斗支持政策&#xff0c;北斗系统正稳步迈向“安全可控&#xff0c;泛在融合&#xff0c;开放兼容&#xff0c;服务全球”的发展目标。遨游通讯紧跟国家战略步…

10/11

一、ARM课程大纲 二、ARM课程学习的目的 2.1 为了找到一个薪资水平达标的工作&#xff08;单片机岗位、驱动开发岗位&#xff09; 应用层(APP) 在用户层调用驱动层封装好的API接口&#xff0c;编写对应的API接口 ----------------------------------------------------…

怎么做接口自动化测试

在分层测试的“金字塔”模型中&#xff0c;接口测试属于第二层服务集成测试范畴。相比UI层&#xff08;主要是WEB或APP&#xff09;自动化测试而言&#xff0c;接口自动化测试收益更大&#xff0c;且容易实现&#xff0c;维护成本低&#xff0c;有着更高的投入产出比&#xff0…