我已经研究了很多如何删除早于给定数字X的文件,但是我只发现了旧的问题值得信任。
我的目录中充满了文件.zip,这些文件是为了留出空间而创建的,但是有一天我将不再有空间,因此我认为我可以选择要删除的天数(X)一些文件以及要删除的文件。目前,我正在寻找一种从文件夹中选择比今天更旧的文件的方法-X并删除它们。
void fCamImgCanc(long pThreadId)
{
ULARGE_INTEGER rFreeBytesAvailable, rTotalNumberOfBytes, rTotalNumberOfFreeBytes;
if(sys.Logs.CamImgSave && sys.Logs.ImageSMod == 1)
{
if (::GetDiskFreeSpaceEx ("C:\\S\\LOGBOOK\\Cam\\Logfold", &rFreeBytesAvailable, &rTotalNumberOfBytes, &rTotalNumberOfFreeBytes))
{
if (rTotalNumberOfBytes.QuadPart < ((rTotalNumberOfBytes.QuadPart * sys.LogB.FreeSpaceOnDisk) / 100)) //if disk size < __% delete the older day
{
do
{
//Date of the oldest group of files > Today - sys.LogB.OlderThanD setted for example to 13
if("C:\\S\\LOGBOOK\\Cam\\Logfold\\FilenameData" > Today - sys.LogB.OlderThanD)
{
DeleteFile("C:\\S\\LOGBOOK\\Cam\\Logfold");
}
}while(rTotalNumberOfBytes.QuadPart < ((rTotalNumberOfBytes.QuadPart * sys.LogB.FreeSpaceOnDisk) / 100)); //free space till we have the space that we need
}
fAddOnZip("C:\\S\\LOGBOOK\\Cam");
}
}
else //ImageSMod = 0 -> Relative "save of the images of the lot and at the next lot delete of them"
{
DO OTHER THINGS
}
}
我已经有了删除功能和zip功能
使用FindFirstFile和FindNextFile枚举目录中的文件。
通过GetSystemTime获取当前时间(并通过SystemTimeToFileTime转换为“文件时间”。
进行适当的数学运算以获取N天前的时间戳。全部基于100ns单位。 (其中一千万等于“一秒钟”)。
然后使用DeleteFile实际删除文件。
以及Windows SDK to concatenate paths中的一些帮助程序功能。与PatchCch.lib
链接。
这里有一些代码可以帮助您入门。如果您调用:
delete_all_old_files_in_directory(L"C:\\Users\\YourName\\Downloads", 7);
它将从一个星期之前的下载文件夹中删除所有内容。
#include <windows.h>
#include <strsafe.h>
#include <PathCch.h>
#include <stdint.h>
void delete_all_old_files_in_directory(const wchar_t* dir, DWORD dwDays)
{
SYSTEMTIME st = {0};
wchar_t szPath[MAX_PATH * 2 + 2];
BOOL succeeded = TRUE;
uint64_t filetimeNow = 0;
uint64_t filetimeCompare = 0;
uint64_t delta;
HANDLE h = INVALID_HANDLE_VALUE;
WIN32_FIND_DATAW data = { 0 };
// dont't try to delete directories or special files
const DWORD dwMask = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN;
GetSystemTime(&st);
::SystemTimeToFileTime(&st, (FILETIME*)&filetimeNow);
delta = 10000000ULL * dwDays * 60 * 60 * 24;
filetimeCompare = filetimeNow - delta;
StringCchCopy(szPath, ARRAYSIZE(szPath), dir);
PathCchAppend(szPath, ARRAYSIZE(szPath), L"*.*");
h = FindFirstFile(szPath, &data);
succeeded = (h != INVALID_HANDLE_VALUE);
while (succeeded)
{
uint64_t fileTimeThisFile = *(uint64_t*)(&data.ftCreationTime);
wchar_t szDeletePath[MAX_PATH] = { 0 };
StringCchCopy(szDeletePath, ARRAYSIZE(szDeletePath), dir);
PathCchAppend(szDeletePath, ARRAYSIZE(szDeletePath), data.cFileName);
if ((fileTimeThisFile < filetimeCompare) && !(data.dwFileAttributes & dwMask))
{
wprintf(L"Deleting: %ls\n", szDeletePath);
DeleteFile(szDeletePath);
}
else
{
wprintf(L"Keeping: %ls\n", szDeletePath);
}
succeeded = FindNextFile(h, &data);
}
if (h != INVALID_HANDLE_VALUE)
{
FindClose(h);
h = NULL;
}
}