我一直在尝试删除30天以上的文件夹中的文件, 下面是代码,我试图获取文件保存日期,但它没有明确返回。
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);
任何人都可以指导我如何实现这一目标吗?
答案 0 :(得分:1)
无需将FILETIME
转换为SYSTEMTIME
。 FILETIME
基本上是一个__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