C++检查目录下文件数量是否达到设定值,到达则删除最早创建的文件

必须先创建目录./Files, 不然程序会崩溃。

#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <time.h> 

using namespace std;


//全局变量

static int 													g_iFileCount;								//文件个数

static std::vector<std::string> 							g_vsFileList;								//文件列表

static std::string											g_sFileDirectory("./Files/");				//文件目录


/* 
	为文件名编号
	@param		sFileName		文件名
	@return		编号
	@note		标准文件名格式:“2018-11-15 14-58-53.txt” ,编号:20181115145853
	@note		特殊文件名格式:“.”		编号:0
	@note		特殊文件名格式:“..”	编号:1
	@note		其它文件名格式:		编号:2
*/
size_t GetFileNameID(std::string sFileName)
{
	if(sFileName == ".")
		return 0;
	else if(sFileName == "..")
		return 1;
	else if(sFileName.size() != std::string("2018-11-15 14-58-53.txt").size())
		return 2;
	
	size_t ulID = 0;
	int    iNum;
	char   cFiltration;
	std::vector<int> viData;
	std::stringstream ssStream(sFileName);
	
	for(int i = 0; i != 6; ++i)
	{
		ssStream >> iNum;																			//读出数据
		
		if(i != 2)
		{
			ssStream >> cFiltration;																	//读取数据后面跟着的符号
			// cout << "iNum:" << iNum << " " << "cFiltration:" << cFiltration << endl;
			if((cFiltration != '-' && cFiltration != ' ' && cFiltration != '.') || (ssStream.fail()))
				return 2;
		}
		
		viData.push_back(iNum);
	}
	
	ulID += viData[0] * 10000000000;															
	ulID += viData[1] * 100000000;															
	ulID += viData[2] * 1000000;
	ulID += viData[3] * 10000;
	ulID += viData[4] * 100;
	ulID += viData[5];
	
	return ulID;
}


/* 
	遍历目录
	@param		path		路径
	@param		files		保存路径下的文件名
	@return		无
*/
void ScanDir(const std::string path, std::vector<std::string> &files)
{
	DIR    *dir;
    struct    dirent    *ptr;
    dir = opendir(path.c_str()); 																		//打开目录
	
	files.clear();																						//清空文件列表
    while((ptr = readdir(dir)) != NULL) 																//读取目录下文件
    {
		files.push_back(ptr->d_name);
    }
    closedir(dir);
	
	g_iFileCount = files.size() - 2;																	//保存文件数量,减2是减去目录中的 “.” “..”
	
	std::vector<size_t> vulFileID;
	for(auto i = files.cbegin(); i != files.cend(); ++i)												//文件名编号
	{
		vulFileID.push_back(GetFileNameID(*i));
	}
	
	for(int i = 0; i < vulFileID.size() - 1; ++i)														//冒泡排序
	{
		for(int j = 0; j < vulFileID.size() - 1 - i; ++j)
		{
			if(vulFileID[j] > vulFileID[j + 1])
			{
				size_t ulTemp 		= vulFileID[j];
				vulFileID[j]  		= vulFileID[j + 1];
				vulFileID[j + 1]    = ulTemp;
				
				std::string sTemp 	= files[j];
				files[j]  		  	= files[j + 1];
				files[j + 1]        = sTemp;
			}
		}
	}
}


/* 
	打印目录下的文件
	@param		files		保存路径下的文件
	@return		无
*/
void PrintFiles(const std::vector<std::string> &files)
{
	if(g_iFileCount)
		std::cout << "当前目录下有" << g_iFileCount << "个文件,它们是:" << std::endl;
	else
		std::cout << "当前目录下没有文件!" << std::endl;
	
	for(auto i = files.cbegin(); i != files.cend(); ++i)
	{
		if((*i != ".") && (*i != ".."))
			std::cout << *i << std::endl;
	}
}


/* 
	获取系统当前时间
	@param		无
	@return		时间
*/
std::string GetSystemTime()
{
    time_t timep;
    time (&timep);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y-%m-%d %H-%M-%S",localtime(&timep) );
    return tmp;
}


/*
	检查目录中文件数量是否达到最大数量,如果达到则删除一个文件
	@param		iMaxFileCount		最大文件数量
	@return		无
*/
void CheckFileCount(int iMaxFileCount)
{
	ScanDir(g_sFileDirectory, g_vsFileList);								//扫描目录,填充文件列表
	
	if(g_iFileCount >= iMaxFileCount)										//检查数量
	{
		for(auto i = g_vsFileList.begin(); i != g_vsFileList.end(); ++i)
		{
			if((*i != ".") && (*i != ".."))
			{
				std::string sFile(g_sFileDirectory);
				sFile += *i;
				if(!remove(sFile.c_str()))
				{
					std::cout << "删除文件" << sFile << "成功!" << std::endl;
				}
				else
				{
					std::cout << "删除文件" << sFile << "失败!" << std::endl;
				}
				break;
			}
		}
	}
}


/*
	创建文件
	@param		无
	@return		0		成功
	@return		1		失败
*/
int CreateNewFile()
{
	std::string sFileNmae(g_sFileDirectory);
	sFileNmae += std::string(GetSystemTime()) + ".txt";
	ofstream fsStream(sFileNmae);
	if(fsStream.is_open())
	{
		fsStream.close();
		std::cout << "创建文件" << sFileNmae << "成功!" << std::endl;
		return 0;
	}
	else
	{
		std::cout << "创建文件" << sFileNmae << "失败!" << std::endl;
		return 1;
	}
}


/* 
	main
	@param		argc		命令个数
	@param		argv		命令内容
	@return		0
*/
int main(int argc, char **argv)
{
	CheckFileCount(5);												//检测目录中是否达到5个文件,达到了则删除一个文件
	CreateNewFile();												//创建一个新文件
	ScanDir(g_sFileDirectory, g_vsFileList);
	PrintFiles(g_vsFileList);										//打印文件目录
	
    return 0;
}



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值