C++完成目录下文件夹和各种类型文件的超时删除

C++完成目录下文件夹和文件的超时删除

最近的一个项目遇到了要删除过时的一些自己这边生成的文件
思路就是先找到文件(包括文件夹),然后判断他们的时间来确定是否删除文件(文件夹)。

  • 1.CFileFind 类
    执行本地文件搜索,并且是执行 Internet 文件搜索的 CGopherFileFind 和 CFtpFileFind 的基类。

语法:

class CFileFind : public CObject

能使用到的公共方法

属性说明
CFileFind::FindFile搜索目录以获取指定文件名。
CFileFind::FindNextFile从上一次对 FindFile 的调用继续文件搜索。
CFileFind::GetCreationTime获取文件的创建时间。
CFileFind::GetLastWriteTime获取上次更改并保存文件的时间。
CFileFind::GetFileName获取所找到文件的名称(包括扩展名)

CFileFind microsoft 定义

  • 2.CTime 类
    表示绝对时间和日期。

语法:

class CTime

能使用到的公共方法

属性说明
CTime::GetCurrentTime创建一个表示当前时间的 CTime 对象(静态成员函数)

CTime microsoft 定义

  • 3.CTimeSpan 类
    时间量,在内部存储为时间跨度的秒数。

语法:

class CTimeSpan

能使用到的公共方法

属性说明
CTimeSpan::GetDays返回一个值,该值表示此 CTimeSpan 中的完成天数。
CTimeSpan::GetTotalHours返回一个值,该值表示此 CTimeSpan 中的总完成小时。

CTimeSpan microsoft 定义

  • 4.文件删除方法

语法

BOOL DeleteFileA( [in] LPCSTR lpFileName);
BOOL RemoveDirectoryA([in] LPCSTR lpPathName);
方法(fileapi.h)说明
DeleteFileA删除现有文件。
RemoveDirectoryA删除现有空目录。

RemoveDirectoryA microsoft 定义

DeleteFileA microsoft 定义

  • 5.其他方法

语法

template <size_t size>
errno_t strcpy_s(
   char (&dest)[size],
   const char *src
); // C++ only

template <size_t size>
int sprintf_s(
   char (&buffer)[size],
   const char *format,
   ...
); // C++ only
方法(fileapi.h)说明
strcpy_s复制字符串。
sprintf_s将设置格式的数据写入字符串。

实现代码

//递归删除超时的目录和目录下所有文件
bool DeleteTimeoutDirectory(char* strDirName)
{
	CFileFind tempFind;
	
	char strTempFileFind[MAX_PATH];
	
	sprintf_s(strTempFileFind, "%s\\*.*", strDirName);
	
	//查找文件   搜索目录以获取指定文件名。
	BOOL IsFinded = tempFind.FindFile(strTempFileFind);
	while (IsFinded)
	{
		IsFinded = tempFind.FindNextFile();												//从上一次对 FindFile 的调用继续文件搜索。

		if (!tempFind.IsDots())															//确定所找到文件的名称是否具有名称“.”或“..”,指示该名称实际上是一个目录。
		{
			//获取时间差
			CTime fileTime;
			int rettime = tempFind.GetLastWriteTime(fileTime);
			CTime newTime = CTime::GetCurrentTime();
			CTimeSpan timespan = newTime - fileTime;
			int nDays = timespan.GetDays();
			//获取时间差END
			
			char strFoundFileName[MAX_PATH];
			strcpy_s(strFoundFileName, tempFind.GetFileName().GetBuffer(MAX_PATH));    //获取所找到文件的名称

			if (!tempFind.IsDirectory())                                                 //确定所找到文件是否为目录。
			{
				//删除文件
				char strTempFileName[MAX_PATH];
				sprintf_s(strTempFileName, "%s\\%s", strDirName, strFoundFileName);
				if (nDays > 3)   //时间大于3天就删除
				{
					DeleteFile(strTempFileName);
				}
			}
			else
			{
				//递归目录
				char strTempDir[MAX_PATH];
				sprintf_s(strTempDir, "%s\\%s", strDirName, strFoundFileName);

				DeleteTimeoutDirectory(strTempDir);//回调
			}
		}
	}

	tempFind.Close();

	//删除文件夹  有文件存在会删除失败 也返回true
	if (!RemoveDirectory(strDirName))
	{
		return TRUE;
	}
	return TRUE;
}
  • 注意可以选择文件的删除类型
    sprintf_s(strTempFileFind, “%s\\*.*”, strDirName);
    这里的“*.*”是指定的文件类型
    “*”是匹配所有的字符串
    例如:删除.TEXT类型就是 “*.TEXT”
  • 时间可以改为小时等,使用CTimeSpan 类不同方法获取时间差
    此处是 if (nDays > 3) //时间大于3天就删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值