Windows API 文件和时间相关(1)

1、判断目录下某个文件存在,如果存在超过多长时间则删除

#include <iostream>
#include <windows.h>
#include <ctime>

// 获取文件的最后修改时间
time_t GetLastWriteTime(const char* filePath) {
    
    
    WIN32_FIND_DATAA fileInfo;
    HANDLE hFind = FindFirstFileA(filePath, &fileInfo);
    if (hFind != INVALID_HANDLE_VALUE) {
    
    
        FindClose(hFind);
        return fileInfo.ftLastWriteTime.dwLowDateTime;
    } else {
    
    
        return 0;
    }
}

// 检查文件是否存在
bool FileExists(const char* filePath) {
    
    
    DWORD dwAttrib = GetFileAttributesA(filePath);
    return (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

// 删除文件
bool DeleteFile(const char* filePath) {
    
    
    return DeleteFileA(filePath) != 0;
}

int main() {
    
    
    const char* filePath = "your_file_path";
    if (FileExists(filePath)) {
    
    
        // 获取当前时间
        time_t currentTime = time(nullptr);
        
        // 获取文件的最后修改时间
        time_t lastWriteTime = GetLastWriteTime(filePath);
        
        // 计算时间间隔
        double timeDiff = difftime(currentTime, lastWriteTime);
        
        // 一周的秒数
        const double weekSeconds = 7 * 24 * 60 * 60;
        
        // 检查时间间隔是否超过7天
        if (timeDiff > weekSeconds) {
    
    
            // 删除文件
            if (DeleteFile(filePath)) {
    
    
                std::cout << "文件已删除" << std::endl;
            } else {
    
    
                std::cerr << "无法删除文件" << std::endl;
            }
        } else {
    
    
            std::cout << "文件存在时间不超过7天" << std::endl;
        }
    } else {
    
    
        std::cout << "文件不存在" << std::endl;
    }
    
    return 0;
}

请确保将 "your_file_path"替换为您要操作的文件的实际路径。

2、达到以北京某个时间点执行某个操作

Windows API中的定时器功能来实现这个功能。下面是一个示例代码,演示了如何使用定时器来每秒检查当前时间是否已经达到了北京时间的20:00。

#include <Windows.h>
#include <iostream>
#include <ctime>

void CheckActivityStart() {
    
    
    // 获取当前时间
    time_t currentTime = time(nullptr);
    struct tm* localTime = localtime(&currentTime);

    // 判断当前时间是否是北京时间的20:00
    if (localTime->tm_hour == 20 && localTime->tm_min == 0) {
    
    
        // 如果是,执行活动开启的操作
        std::cout << "活动已开启!" << std::endl;

        // 在这里执行活动开启的相关操作
        // ...
    }
}

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
    
    
    // 每秒检查一次当前时间是否已经到达20:00
    CheckActivityStart();
}

int main() {
    
    
    // 创建定时器,每秒执行一次TimerProc回调函数
    UINT_PTR timerId = SetTimer(NULL, 0, 1000, TimerProc);
    if (timerId == 0) {
    
    
        // 处理定时器创建失败的情况
        std::cerr << "定时器创建失败!" << std::endl;
        return 1;
    }

    // 等待定时器事件
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // 销毁定时器
    KillTimer(NULL, timerId);

    return 0;
}

  • 上面提供的代码主要实现了以下几个功能:

    • 使用 SetTimer 函数创建一个定时器,定时器每隔一定的时间(1000毫秒,即1秒)触发一次。SetTimer 函数的参数包括:

      • HWND hWnd: 指定接收定时器消息的窗口句柄。这里设置为 NULL,表示不需要一个窗口来接收消息,因此在定时器触发时会调用指定的回调函数。
      • UINT_PTR nIDEvent: 指定定时器的标识符,可以用来区分多个定时器。这里设置为 0。
      • UINT uElapse: 指定定时器的时间间隔,单位为毫秒。这里设置为 1000,即每隔1秒触发一次。
      • TIMERPROC lpTimerFunc: 指定定时器消息到达时调用的回调函数。这里设置为 TimerProc 函数。
        定义了一个 TimerProc 回调函数,用于处理定时器触发时的操作。在本例中,这个函数并未做任何具体的操作,只是作为一个示例。如果需要在定时器触发时执行具体的操作,可以在这个函数中编写相应的代码。
    • 在主函数中,使用一个消息循环来接收和处理消息。GetMessage 函数用于从消息队列中获取消息,如果没有消息,则会让当前线程进入等待状态。当有消息到达时,TranslateMessage 函数用于翻译键盘消息,然后将消息发送到消息处理函数 DispatchMessage 中进行处理。在本例中,当定时器触发时,会生成一个定时器消息,然后被 GetMessage 获取到并调用相应的处理函数进行处理。

    • 在消息循环中,当获取到 WM_QUIT 消息时,表示应用程序要退出,此时消息循环会退出,程序结束运行。

这个代码的主要逻辑是创建一个定时器,然后进入一个消息循环中,等待定时器事件的发生。当定时器事件发生时,会调用 TimerProc 回调函数进行处理。

  • 能够在特定条件下退出,您需要在消息循环中添加相应的逻辑来处理退出条件。例如,在检查活动开启的函数中添加退出条件,并在满足条件时调用 PostQuitMessage 函数来发送退出消息,以触发程序退出。

在 Windows 环境下,消息循环通常使用 GetMessage 函数来获取消息。即使是定时器事件,也会被包装成一个消息发送到消息队列中,因此在消息循环中仍然可以接收到定时器事件。

GetMessage 函数的作用是从消息队列中获取消息,如果没有消息,它会让当前线程进入等待状态,直到有消息到达或者消息队列被销毁。因此,即使是定时器事件,它也会被封装成一个消息,然后被 GetMessage 获取到并处理。

所以,当定时器事件触发时,操作系统会将一个特定的消息放入消息队列中,然后 GetMessage 函数会将这个消息取出来,然后调用相应的处理函数进行处理。

下面是一个示例,假设我们希望当活动开始后,程序再等待5分钟后就自动退出:

#include <Windows.h>
#include <iostream>
#include <ctime>

// 全局变量,用于标记活动是否已经开始
bool activityStarted = false;

void CheckActivityStart() {
    
    
    // 如果活动已经开始,则在5分钟后退出程序
    if (activityStarted) {
    
    
        time_t currentTime = time(nullptr);
        struct tm* localTime = localtime(&currentTime);
        if (localTime->tm_hour == 20 && localTime->tm_min >= 5) {
    
    
            // 发送退出消息,通知消息循环退出
            PostQuitMessage(0);
        }
    }
}

void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) {
    
    
    // 每秒检查一次当前时间是否已经到达20:00
    CheckActivityStart();
}

int main() {
    
    
    // 创建定时器,每秒执行一次TimerProc回调函数
    UINT_PTR timerId = SetTimer(NULL, 0, 1000, TimerProc);
    if (timerId == 0) {
    
    
        // 处理定时器创建失败的情况
        std::cerr << "定时器创建失败!" << std::endl;
        return 1;
    }

    // 等待定时器事件和退出消息
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
    
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    // 销毁定时器
    KillTimer(NULL, timerId);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_44918090/article/details/136934624