C++完成目录下文件夹和文件的超时删除
最近的一个项目遇到了要删除过时的一些自己这边生成的文件
思路就是先找到文件(包括文件夹),然后判断他们的时间来确定是否删除文件(文件夹)。
- 1.CFileFind 类
执行本地文件搜索,并且是执行 Internet 文件搜索的 CGopherFileFind 和 CFtpFileFind 的基类。
语法:
class CFileFind : public CObject
能使用到的公共方法
属性 | 说明 |
---|---|
CFileFind::FindFile | 搜索目录以获取指定文件名。 |
CFileFind::FindNextFile | 从上一次对 FindFile 的调用继续文件搜索。 |
CFileFind::GetCreationTime | 获取文件的创建时间。 |
CFileFind::GetLastWriteTime | 获取上次更改并保存文件的时间。 |
CFileFind::GetFileName | 获取所找到文件的名称(包括扩展名) |
- 2.CTime 类
表示绝对时间和日期。
语法:
class CTime
能使用到的公共方法
属性 | 说明 |
---|---|
CTime::GetCurrentTime | 创建一个表示当前时间的 CTime 对象(静态成员函数) |
- 3.CTimeSpan 类
时间量,在内部存储为时间跨度的秒数。
语法:
class CTimeSpan
能使用到的公共方法
属性 | 说明 |
---|---|
CTimeSpan::GetDays | 返回一个值,该值表示此 CTimeSpan 中的完成天数。 |
CTimeSpan::GetTotalHours | 返回一个值,该值表示此 CTimeSpan 中的总完成小时。 |
- 4.文件删除方法
语法
BOOL DeleteFileA( [in] LPCSTR lpFileName);
BOOL RemoveDirectoryA([in] LPCSTR lpPathName);
方法(fileapi.h) | 说明 |
---|---|
DeleteFileA | 删除现有文件。 |
RemoveDirectoryA | 删除现有空目录。 |
- 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天就删除