bool DeleteTimeOutFile(const char* dir, int nSpanTime)
{
if (dir == nullptr || strlen(dir) <= 0) return false;
struct stat s;
//lstat(dir, &s);
stat(dir, &s);
if (!S_ISDIR(s.st_mode))
{
WriteRunLog(VIS_LOG_ERROR, "%s is not a valid directory.", dir);
return false;
}
DIR* pDir = opendir(dir);
if (nullptr == pDir)
{
WriteRunLog(VIS_LOG_ERROR, "cannot open dir %s.", dir);
return false;
}
WriteRunLog(VIS_LOG_INFO, "open dir %s success", dir);
int nChildCnt = 0;
struct dirent* filename;
while ((filename = readdir(pDir)) != nullptr)
{
if (strcmp(filename->d_name, ".") == 0 || 0 == strcmp(filename->d_name, ".."))
continue;
nChildCnt++;
char szChild[256] = { 0 };
sprintf(szChild, "%s/%s", dir, filename->d_name);
WriteRunLog(VIS_LOG_INFO, "szChild = %s", szChild);
if (filename->d_type == DT_DIR)
{
if (DeleteTimeOutFile(szChild, nSpanTime))
{
nChildCnt--;
}
}
else
{
stat(szChild, &s);
WriteRunLog(VIS_LOG_INFO, "sec:%lld, now:%lld", s.st_mtim.tv_sec, time(nullptr));
if (time(nullptr) - s.st_mtim.tv_sec > nSpanTime)
{
if (0 == remove(szChild))
{
WriteRunLog(VIS_LOG_INFO, "delete file %s success.", szChild);
nChildCnt--;
}
else
{
WriteRunLog(VIS_LOG_ERROR, "delete file %s failed.", szChild);
}
}
}
}
closedir(pDir);
//不删除根目录
if ( 0 == nChildCnt && 0 != strcmp(dir, g_Conf.m_strRootDir.c_str()))
{
if (0 == rmdir(dir))
{
WriteRunLog(VIS_LOG_INFO, "delete dir %s success.", dir);
return true;
}
else
{
WriteRunLog(VIS_LOG_ERROR, "delete dir %s failed.", dir);
return false;
}
}
return false;
}