如何删除早于X的文件

问题描述 投票:0回答:1

我已经研究了很多如何删除早于给定数字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功能

c windows
1个回答
0
投票

使用FindFirstFileFindNextFile枚举目录中的文件。

通过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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.