C++ 设置文件最近修改时间

利用VS开发C++项目,经常发现修改系统时间后,每次编译过程会变得很慢,其原因就是当你把系统时间调到未来的一个时间点,然后有意或者无意编辑过一些代码文件,那么这些文件的时间戳就停留在未来.

当你把系统时间调到现在后,编译器每次编译的时候,总会判定这些文件是最新的,所以总是会把这些文件编译一遍,如果这些文件中有某些被其他文件引用,那么会有更多的文件被重新编译,而且这种过程每次

编译都会执行一遍,导致编译速度降低.为了解决这个问题,我特意写了一个小工具.

这个工具的原理跟简单,找出指定目录下时间戳大于当前时间的文件,并把它们的时间戳设置为现在时间.

调用的时候,配合一个bat脚本,把需要检查的代码目录传进去就好了,例如

echo off
ResetFileTime MsgDefine Server
pause
#include <io.h>
#include <windows.h>
#include <stdint.h>
#include <vector>
#include <string>
#include <set>
#include <stdio.h>
#include <iostream>

bool IsCompileFile(const std::string & extension)
{
    static std::set<std::string> setComplieFileExtension = {".cpp", ".c", ".cc", ".h", ".hpp"};
    return setComplieFileExtension.find(extension) != setComplieFileExtension.end();
}

std::string GetFileNameExtension(const std::string & fileName)
{
    /*
    DWORD dwAttrib = GetFileAttributes(fileName.c_str());
    if (dwAttrib == INVALID_FILE_ATTRIBUTES)
    {
        return "";
    }
    if (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)
    {
        return "";
    }*/
    size_t dotpos = fileName.find_last_of(".");
    if(dotpos == std::string::npos)
    {
        return fileName;
    }
    return fileName.substr(dotpos, fileName.length() - dotpos);
}

bool CompareSystemTime(const SYSTEMTIME & lhs, const SYSTEMTIME & rhs)
{
    if(lhs.wYear > rhs.wYear)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth > rhs.wMonth)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth == rhs.wMonth && lhs.wDay > rhs.wDay)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth == rhs.wMonth && lhs.wDay == rhs.wDay
            && lhs.wHour > rhs.wHour)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth == rhs.wMonth && lhs.wDay == rhs.wDay
            && lhs.wHour == rhs.wHour && lhs.wMinute > rhs.wMinute)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth == rhs.wMonth && lhs.wDay == rhs.wDay
            && lhs.wHour == rhs.wHour && lhs.wMinute == rhs.wMinute && lhs.wSecond > rhs.wSecond)
    {
        return true;
    }
    else if(lhs.wYear == rhs.wYear && lhs.wMonth == rhs.wMonth && lhs.wDay == rhs.wDay
            && lhs.wHour == rhs.wHour && lhs.wMinute == rhs.wMinute && lhs.wSecond == rhs.wSecond && lhs.wMilliseconds > rhs.wMilliseconds)
    {
        return true;
    }
    return false;
}

void DumpSystemTime(const std::string & prefix, const SYSTEMTIME & t)
{
    printf("%s %04d-%02d-%02d %02d:%02d:%02d\n", prefix.c_str(), t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond);
}

void ResetFileTime(const std::string & dir)
{
    WIN32_FIND_DATA fileInfo;
    HANDLE hFile = nullptr;
    char tmpPath[MAX_PATH] = { 0 };
    sprintf_s(tmpPath, "%s\\*.*", dir.c_str());
    if((hFile = FindFirstFile(tmpPath, &fileInfo)) == HANDLE(-1))
    {
        return;
    }
    do
    {
        if(fileInfo.dwFileAttributes & _A_SUBDIR)
        {
            if(strcmp(fileInfo.cFileName, ".") == 0 || strcmp(fileInfo.cFileName, "..") == 0)
            {
                continue;
            }
            sprintf_s(tmpPath, "%s\\%s", dir.c_str(), fileInfo.cFileName);
            ResetFileTime(tmpPath);
        }
        else
        {
            sprintf_s(tmpPath, "%s\\%s", dir.c_str(), fileInfo.cFileName);
            std::string extension = GetFileNameExtension(fileInfo.cFileName);
            if(IsCompileFile(extension))
            {
                FILETIME lastWriteLocalFileTime;
                FileTimeToLocalFileTime(&fileInfo.ftLastWriteTime, &lastWriteLocalFileTime);
                SYSTEMTIME lastWriteLocalSysTime, nowTime;
                FileTimeToSystemTime(&lastWriteLocalFileTime, &lastWriteLocalSysTime);
                GetLocalTime(&nowTime);
                if(CompareSystemTime(lastWriteLocalSysTime, nowTime))
                {
                    HANDLE file =  ::CreateFile(tmpPath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL);

                    DumpSystemTime(fileInfo.cFileName, lastWriteLocalSysTime);
                    FILETIME nowWriteLocalFileTime;
                    SystemTimeToFileTime(&nowTime, &nowWriteLocalFileTime);
                    FILETIME nowWriteSysFileTime;
                    LocalFileTimeToFileTime(&nowWriteLocalFileTime, &nowWriteSysFileTime);
                    BOOL ret = SetFileTime(file, &nowWriteSysFileTime, &nowWriteSysFileTime, &nowWriteSysFileTime);
                    if(ret == TRUE)
                    {
                        printf("reset time succ.\n");
                    }
                    else
                    {
                        printf("reset time fail.error=%d\n", GetLastError());
                    }
                }
            }
        }
    }
    while(FindNextFile(hFile, &fileInfo) == TRUE);
    FindClose(hFile);
}

int32_t main(int32_t argc, char *argv[])
{
    for(int32_t i = 1; i < argc; ++i)
    {
        std::string dir = argv[i];
        ResetFileTime(dir);
    }
    return 0;
}
时间: 2024-10-16 20:40:42

C++ 设置文件最近修改时间的相关文章

Android 扫描音乐文件、两种方式获取文件最新修改时间

package com.example.demo_mediascanner; import java.io.File; import java.util.Calendar; import java.util.Date; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.app.Acti

文件按修改时间和创建时间遍历

NSFileCreationDate和NSFileModificationDate两个属性分别代表文件创建时间和修改时间 NSArray *sortedPaths = [array sortedArrayUsingComparator:^(NSString * firstPath, NSString* secondPath) { NSString *firstUrl = [docPath stringByAppendingPathComponent:firstPath];//获取前一个文件完整路

python笨办法解决zipfile解压会改变文件最后修改时间的问题

# -*- coding=gbk -*- import zipfile def UnZip(path, patht):     #path 为需要解压的文件路径,patht为解压的目标目录     f = zipfile.ZipFile(path, 'r')     print "开始解压文件..."     for file in f.namelist():         print "正在解压文件:%s to %s" %(file, patht)       

C# 读取文件的修改时间、访问时间、创建时间

C# 获取文件的各个时间如下: 表2<ccid_nobr> 属性 功能和用途 Attributes 返回和文件相关的属性值,运用了FileAttributes枚举类型值 CreationTime 返回文件的创建时间 Exists 检查文件是否存在于给定的目录中 Extension 返回文件的扩展名 LastAccessTime 返回文件的上次访问时间 FullName 返回文件的绝对路径 LastWriteTime 返回文件的上次写操作时间 Name 返回给定文件的文件名 Delete() 删

C#实现对指定文件夹中文件按修改时间排序

string path = "~/Document/Introduction/团队管理制度/";            DirectoryInfo dirinfo = new DirectoryInfo(Server.MapPath(path));            FileInfo[] Files = dirinfo.GetFiles();            Array.Sort<FileInfo>(Files, new FIleLastTimeComparer(

遍历当前目录下文件的修改时间

#!/usr/bin/python # -*- coding: utf-8 -*- import os,datetime crd = os.getcwd() files = os.listdir(crd) for fi in files: mt = os.stat(os.path.abspath(fi)).st_mtime d_mt = datetime.datetime.fromtimestamp(mt) print d_mt.strftime('%Y-%m-%d %H:%M:%S')[0:1

utime修改文件的存取,修改时间

#include <sys/types.h> #include <utime.h> int utime(const char *filename, const struct utimbuf *times); #include <sys/time.h> int utimes(const char *filename, const struct timeval times[2]); struct utimbuf { time_t actime; /* access time

获取、设置文件的时间

function CovFileDate(Fd:_FileTime):TDateTime; { 转换文件的时间格式 } var Tct:_SystemTime; Temp:_FileTime; begin FileTimeToLocalFileTime(Fd,Temp); FileTimeToSystemTime(Temp,Tct); CovFileDate:=SystemTimeToDateTime(Tct); end; procedure GetFileTime(const Tf:strin

定时删除文件夹&quot;$1&quot;下最后修改时间大于当前时间&quot;$2&quot;天的文件

shell 脚本: #!/bin/bash now=`date "+%Y-%m-%d_%H:%M:%S"`      #获取当前时间 echo "当前时间: "$now now=`date +%s`            #获取当前时间戳   单位:秒 echo "当前时间戳: "$now function getdir(){          #遍历文件夹和文件夹下所有的文件 #    echo "删除文件夹"$1"