删除超过30天的文件

时间:2017-09-13 07:21:30

标签: c++ windows winapi

我一直在尝试删除30天以上的文件夹中的文件, 下面是代码,我试图获取文件保存日期,但它没有明确返回。

I have attached the image

char c_szText[_MAX_PATH];
wcstombs(c_szText, username, wcslen(username) + 1);

std::string Fstr("c:\\Users\\username\\AppData\\Test\\*");
Fstr.replace(9, 8, c_szText);

const time_t t = time(NULL);
struct tm* tl = localtime(&t);

WIN32_FIND_DATA info;
HANDLE hp;
hp = FindFirstFile(str2.c_str(), &info);
do
{
    FILETIME ftCreate, ftAccess, ftWrite;
    SYSTEMTIME stUTC, stLocal;
    DWORD dwRet;

    LPTSTR lpszString;
    GetFileTime(hp, &ftCreate, &ftAccess, &ftWrite);
    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ftWrite, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
    if (tl->tm_year + 1900 > stLocal.wYear)
    { 
        DeleteFile(info.cFileName);
    }
    else if ((tl->tm_mon - ((stLocal.wMonth) - 1)) > 1)
    {
        DeleteFile(info.cFileName);
    }
    else if(tl->tm_mon > ((stLocal.wMonth)-1))
    {
        if(tl->tm_mday <= stLocal.wDay)
        { 
            DeleteFile(info.cFileName);
        }
    }
} while (FindNextFile(hp, &info));
FindClose(hp);

任何人都可以指导我如何实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

无需将FILETIME转换为SYSTEMTIMEFILETIME基本上是一个__int64时间值,以100ns为单位(从某个参考时间开始),这正是您进行时间比较所需的时间。

只需通过GetSystemTimeAsFileTime获取当前时间,从中减去30天,这将是您的门槛。

答案 1 :(得分:1)

无需将Unicode字符串转换为MBCS。使用基于WCHAR的{​​{1}}函数代替基于FindFirstFileW()的{​​{1}}函数。

无需将时间转换为本地时区。文件时间以UTC表示,您可以以UTC格式检索当前系统时钟时间。然后你可以比较这两个值而不转换它们。

此外,您没有正确检索文件时间。您将错误的TCHAR传递给FindFirstFile()。它需要一个打开文件的句柄,但是你将它传递给搜索对象的句柄。 HANDLE已包含文件时间,您无需手动检索它们。

此外,您只将文件名传递给GetFileTime()WIN32_FIND_DATA仅包含文件名,而不包含文件夹路径。如果您不预先添加文件夹路径,DeleteFile()将把文件名解释为相对于调用进程的当前工作目录,这不保证(或可能)在您期望的文件夹中。

尝试更像这样的事情:

WIN32_FIND_DATA