C++ 扫描当前路径下文件并删除大文件

news2024/9/21 12:45:21

C++ 扫描当前路径下文件并删除大文件

  • C++获取当前路径
  • 扫描文件路径下规定后缀名称的文件
  • 计算文件大小

1. 获取当前路径

  • 使用<Windows.h>中的GetCurrentDirectory方法实现,单独编写验证程序如下:
#include<iostream>
#include<Windows.h>
using namespace std;
int main(void) 
{
	char  buf[1000];
	GetCurrentDirectory(1000, buf);
	cout << buf << endl;
	system("pause");
	return 0;
}

  • 函数说明:
DWORD GetCurrentDirectory(
  [in]  DWORD  nBufferLength,
  [out] LPTSTR lpBuffer
);

-----------++++----------
参数说明:
[in] nBufferLength:存储目录字符串的缓冲区长度,以TCHARs为单位,需要包括终止字符NULL的空间
[out] lpBuffer:指针,指向一块缓冲区,用于接收结果(当前目录绝对路径)字符串,以NULL为结尾。

返回值
执行成功:返回写入缓冲区的字符数(不包括终止null);
执行失败:返回值为0;

缓冲区不够大时将返回指定缓冲区所需大小,以字符为单位(包括终止null)。
故可以通过GetCurrentDirectory(0, NULL);获取缓冲区所需大小,再进行缓冲区初始化完成创建。
  • VS调试报错解决方法:
使用 Visual Studio 2019 编译器,出现报错"char *"类型的实参与"LPWSTR"类型的形参不兼容。

---> 解决:
配置解决方案的属性,在(配置属性->高级->高级属性)中找到字符集,将其更改为使用多字节字符集。

在这里插入图片描述

2. 文件扫描

  • 按照规定后缀名称扫描文件夹,得到规定后缀名的文件列表
//获取特定格式的文件名
/*获取特定格式的文件名
该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);
第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
第三个直接使用".bmp、.txt、.log"即可
*/
void GetAllFormatFiles(string path, vector<string>& files, string format)
{
	//文件句柄  
	intptr_t   hFile = 0;
	//文件信息  
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					GetAllFormatFiles(p.assign(path).append("\\").append(fileinfo.name), files, format);
				}
			}
			else
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);

		_findclose(hFile);
	}
}

3. 获取文件大小

  • 直接读取文件的物理内存
  • 两种方法示例如下:
// 通过stat结构体 获得文件大小,单位字节
size_t getFileSize(const char* fileName) {

	if (fileName == NULL) {
		return 0;
	}

	// 这是一个存储文件(夹)信息的结构体,其中有文件大小和创建时间、访问时间、修改时间等
	struct stat statbuf;

	// 提供文件名字符串,获得文件属性结构体
	stat(fileName, &statbuf);

	// 获取文件大小
	size_t filesize = statbuf.st_size;

	return filesize;
}


//获取当前文件的大小
long long GetFileSize(string& strPath)
{
	std::ifstream  read_file_(strPath.c_str(), ios::binary);
	long long fileSize = 0;
	if (read_file_.is_open())
	{
		read_file_.seekg(0, ios_base::end);//移动到文件尾
		istream::pos_type file_size = read_file_.tellg();//取得当前位置的指针长度->即文件长度
		read_file_.seekg(0, ios_base::beg);//移动到原来的位置
		return  (long long)file_size;
	}
	return 0;
}

4. 完整应用例程

#include <string>
#include <vector>
#include <io.h>
#include <iostream>
#include <fstream>
#include<Windows.h>
using namespace std;

#include"LogM.h"


// 通过stat结构体 获得文件大小,单位字节
size_t getFileSize(const char* fileName) {

	if (fileName == NULL) {
		return 0;
	}

	// 这是一个存储文件(夹)信息的结构体,其中有文件大小和创建时间、访问时间、修改时间等
	struct stat statbuf;

	// 提供文件名字符串,获得文件属性结构体
	stat(fileName, &statbuf);

	// 获取文件大小
	size_t filesize = statbuf.st_size;

	return filesize;
}


//获取当前文件的大小
long long GetFileSize(string& strPath)
{
	std::ifstream  read_file_(strPath.c_str(), ios::binary);
	long long fileSize = 0;
	if (read_file_.is_open())
	{
		read_file_.seekg(0, ios_base::end);//移动到文件尾
		istream::pos_type file_size = read_file_.tellg();//取得当前位置的指针长度->即文件长度
		read_file_.seekg(0, ios_base::beg);//移动到原来的位置
		return  (long long)file_size;
	}
	return 0;
}


//获取特定格式的文件名
void GetAllFormatFiles(string path, vector<string>& files, string format)
{
	//文件句柄  
	intptr_t   hFile = 0;
	//文件信息  
	struct _finddata_t fileinfo;
	string p;
	if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
	{
		do
		{
			if ((fileinfo.attrib & _A_SUBDIR))
			{
				if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
				{
					GetAllFormatFiles(p.assign(path).append("\\").append(fileinfo.name), files, format);
				}
			}
			else
			{
				files.push_back(p.assign(path).append("\\").append(fileinfo.name));
			}
		} while (_findnext(hFile, &fileinfo) == 0);

		_findclose(hFile);
	}
}




int main()
{
#if 1
	char buf[1000];
	GetCurrentDirectory(1000, buf);
	std::cout << "当前路径:" << buf << std::endl;

	string filePath = "E:\\VS2019\\test_demo\\test_demo";
	vector<string> files;

	//读取所有格式为jpg的文件
	string format = ".log";
	GetAllFormatFiles(filePath, files, format);
	int size = files.size();
	for (int i = 0; i < size; i++)
	{
		cout << files[i] << endl;
		std::cout << "file's size1 = " << getFileSize(files[i].c_str()) << std::endl;
		std::cout << "file's size2 = " << GetFileSize(files[i]) << std::endl;

		int size = getFileSize(files[i].c_str()) * 1024;
		if (size > 4000)
		{
			remove(files[i].c_str());
		}
	}
#else

	log_.FileScan(".txt");


#endif


	system("pause");
	return 0;
}

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

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

相关文章

YOLOv9改进策略:IoU优化 | Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;Powerful-IoU更好、更快的收敛IoU&#xff0c;是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASCAL VOC数据集实现涨点 YO…

R语言基础入门

1.保存或加载工作空间 改变工作目录——进行文件读写&#xff0c;默认去指定文件进行操作。&#xff08;使用R时&#xff0c;最好先设定工作目录&#xff08;setwd(),getwd()&#xff09;&#xff09; setwd(“工作文件路径”)&#xff1a;建立工作目录 getwd&#xff08;&…

【Mysql数据库基础07】DDL 数据定义语言

Data Definition Language 1 库的操作1.1 create 创建1.2 alter 修改1.3 drop 删除 2 表的操作2.1 表的创建2.2 表的修改2.2.1 修改表名2.2.2 修改列名2.2.3 修改列的类型和约束2.2.4 添加列2.2.5 删除列 2.3 表的删除2.4 表的复制 3 练习 1 库的操作 1.1 create 创建 create…

jvm(虚拟机)运行时数据区域介绍

Java虚拟机&#xff08;JVM&#xff09;运行时数据区域是Java程序在运行过程中使用的内存区域&#xff0c;它主要包括以下几个部分&#xff1a; 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 程序计数器是一块较小的内存区域&#xff0c;是线程私有…

法律合规| AI产品法律风险应对措施全解析

在此前推文中我们全面分析了生成式人工智能算法模型可能遇到的法律风险&#xff0c;那么这些风险应该如何应对呢&#xff1f; 1、隐私泄漏风险&#xff1a;企业需要遵守数据安全法和个人信息保护法的规定&#xff0c;确保数据来源合法&#xff0c;使用时获得用户授权&…

citus的快速开始

准备 dockercitus最新版本&#xff08;docker pull citusdata/citus&#xff09; docker网络 docker network create --subnet172.72.9.0/24 citus-test docker network ls启动citus服务 启动协调节点 docker run -dit --name citus-cod -p 5433:5432 -e POSTGRES_PASSWOR…

【vue3学习之路(一)】

文章目录 前言一、vue3项目创建1.1环境准备1.1.1 基于 vue-cli 创建&#xff08;脚手架创建&#xff09;1.1.2 基于 vite 创建&#xff08;推荐&#xff09; 二、熟悉流程总结 前言 参考视频&#xff1a;https://www.bilibili.com/video/BV1Za4y1r7KE?p10&spm_id_frompag…

使用uniapp 的 plus.sqlite 操作本地数据库报错:::table xxx has no column named xxxx

背景&#xff1a; 1、使用uniapp 的 plus.sqlite 进行APP本地数据库操作 2、SQLite 模块用于操作本地数据库文件&#xff0c;可实现数据库文件的创建&#xff0c;执行SQL语句等功能。 遇到&#xff1a;在之前创建的表上进行新增字段的操作时候&#xff0c;出现问题&#xff1a…

MyEclipse打开文件跳转到notepad打开问题

问题描述 windows系统打开README.md文件&#xff0c;每次都需要右键选择notepad打开&#xff0c;感觉很麻烦&#xff0c;然后就把README.md文件打开方式默认选择了notepad&#xff0c;这样每次双击就能打开&#xff0c;感觉很方便。 然后某天使用MyEclipse时&#xff0c;双击RE…

java第一次作业(二)

先写思路&#xff0c;再写代码&#xff0c;思路清晰&#xff0c;才能写对代码 7-6 求12...n的和 思路&#xff1a; 运用expression的字符串输出 重点&#xff1a; expression输出 代码&#xff1a; import java.util.Scanner; public class Main {public static void main…

数据运营常用的8大模型

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…

为什么静态成员函数不能是虚函数

在面向对象编程中&#xff0c;静态成员函数和虚函数都是常见的概念&#xff0c;但它们之间存在着本质上的差异。由于其特性上的差异&#xff0c;静态成员函数不能声明为虚函数。下面我们来探讨一下为什么静态成员函数不能是虚函数。 我在网上查到最多的说法是静态函数没有this指…

数字化转型能给企业创造哪些价值?

企业数字化转型能创造哪些价值&#xff1f; 深耕TOB行业 9 年&#xff0c;下面来分享下自己的一些经验和看法。 &#xff08;看完要是觉得有用&#xff0c;记得点个赞哈~&#xff09; 1、从宏观上理解&#xff0c;我们可以分成4个大的方面&#xff1a; &#xff08;1&#x…

PTA L2-031 深入虎穴 dfs与bfs版

著名的王牌间谍 007 需要执行一次任务&#xff0c;获取敌方的机密情报。已知情报藏在一个地下迷宫里&#xff0c;迷宫只有一个入口&#xff0c;里面有很多条通路&#xff0c;每条路通向一扇门。每一扇门背后或者是一个房间&#xff0c;或者又有很多条路&#xff0c;同样是每条路…

机器学习-05-回归算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中回归算法&#xff0c;包括线性回归&#xff0c;岭回归&#xff0c;逻辑回归等部分。 参考 fit_transform,fit,transform区别和作用详解&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&am…

结构体讲解

目录 一.结构体类型的声明 (1)结构体的声明 (2)结构体的创建和初始化 (3)匿名结构体 (4)结构体的自引用 二.结构体内存对齐 (1)对齐规则 (2)为什么存在内存对齐&#xff1f; (3)结构体传参 三.结构体实现位段 (1)什么是位段 (2)位段的内存分配 (3)位段的跨平…

GDAL中的地理坐标系、投影坐标系及其相互转换

目录 地理坐标系 国内常用地理坐标系 投影坐标系 国内常用投影坐标系&#xff08;不推荐使用&#xff09; 坐标转换 地理坐标转为投影坐标 投影坐标转为地理坐标 地理坐标系 原理参考这篇文章&#xff1a;地理坐标系与投影坐标系区别与联系 https://yunxingluoyun.blog.…

极智项目 | 基于YOLOv5+DeepSort实现的车流量统计算法

欢迎关注我的公众号「极智视界」&#xff0c;获取我的更多技术分享 大家好&#xff0c;我是极智视界&#xff0c;本文分享一下 基于YOLOv5DeepSort实现的车流量统计算法。 车流量统计的实现一般原理是跟踪画面上检测出来的车辆&#xff0c;并给每个框标上了序号&#xff0c;当…

轨迹预测后处理之非极大值抑制(NMS)

非极大值抑制是图像处理里面的一种算法&#xff08;比如边缘检测会使用到&#xff09; 轨迹预测这里借鉴了其思想&#xff0c;比如说对于某个场景中的某辆车&#xff0c;我们使用模型预测 64 条轨迹或者更多&#xff0c;以很好地捕获多模态性&#xff0c;同时每条轨迹对应一个…

JavaScript 基础、内置对象、BOM 和 DOM 常用英文单词总结

一提到编程、软件、代码。对于英语不是很熟悉的同学望而却步。其实没有想像中的难么难&#xff0c;反复练习加上自己的思考、总结&#xff0c;会形成肌肉记忆。整理一下&#xff0c;初学者每天30遍。 1、JavaScript 基础语法 break&#xff1a;中断循环或 switch 语句的执行。…