利用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] = { };
sprintf_s(tmpPath, "%s\\*.*", dir.c_str());
if((hFile = FindFirstFile(tmpPath, &fileInfo)) == HANDLE(-))
{
return;
}
do
{
if(fileInfo.dwFileAttributes & _A_SUBDIR)
{
if(strcmp(fileInfo.cFileName, ".") == || strcmp(fileInfo.cFileName, "..") == )
{
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 = ; i < argc; ++i)
{
std::string dir = argv[i];
ResetFileTime(dir);
}
return ;
}

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

  1. touch修改文件的修改时间和访问时间,ls --full-time显示文件详细,stat命令

    1. 同时修改文件的修改时间和访问时间 touch -d "2010-05-31 08:10:30" test.doc 2. 只修改文件的修改时间 touch -m -d &quo ...

  2. hdfs文件按修改时间下载

    应用于:对于不同用户创建的表目录,进行文件的下载,程序中执行hadoop cat命令 下载文件到本地,随后通过ftp传至目标服务器,并将hdfs文件目录的修改时间存入mysql中.每次修改前将mysq ...

  3. png文件格式详解,获取文件的修改时间,创作时间

    http://dev.gameres.com/Program/Visual/Other/PNGFormat.htmhttp://www.360doc.com/content/11/0428/12/10 ...

  4. python 获取文件的修改时间

    os.path.getmtime(name) #获取文件的修改时间 os.stat(path).st_mtime#获取文件的修改时间 os.stat(path).st_ctime #获取文件修改时间 ...

  5. Powershell按文件最后修改时间删除多余文件

    Powershell按文件最后修改时间删除多余文件 1. 删除目录内多余文件,目录文件个数大于$count后,按最后修改时间倒序排列,删除最旧的文件. Sort-Object -Property La ...

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

    C# 获取文件的各个时间如下: 表2<ccid_nobr> 属性 功能和用途 Attributes 返回和文件相关的属性值,运用了FileAttributes枚举类型值 CreationT ...

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

    string path = "~/Document/Introduction/团队管理制度/";            DirectoryInfo dirinfo = new Di ...

  8. TDirectory.GetCreationTime、TDirectory.SetCreationTime获取和设置文件夹创建时间

    使用函数: System.IOUtils.TDirectory.GetCreationTime//获取创建时间 System.IOUtils.TDirectory.SetCreationTime//设 ...

  9. C#获取ftp文件最后修改时间

    public static DateTime GetFileModifyDateTime(string ftpServerIP,string ftpFolder,string ftpUserID,st ...

随机推荐

  1. 洛谷noip 模拟赛 day1 T3

    T7983 大芳的逆行板载 题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇 ...

  2. suse10与suse11连接Xmanager的配置

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://feidandelion.blog.51cto.com/1050439/42217 ...

  3. php5.3+ 安装(mysqlnd )

    摘自:http://blog.csdn.net/dragon8299/article/details/6273295 如何安装mysqlnd LINUX环境中,默认情况下,php中的mysql扩展还是 ...

  4. 关于backBarButtonItem的N种方法

    替换返回按钮的文字 很多app的要求所有的返回按钮的title都是“返回”,如果上一层题目文字太多,下一层的返回按钮文字就会显示不完全,而且这样可以使软件显得整洁. 方法一: 最普通的想法,A界面的n ...

  5. mysql 取消命令行继续编辑

    mysql> create database mingongge defa\c#回车 置空mysql>  加一个\c  cancel 编辑命令 回车

  6. 负载均衡技术之-lvs

    LVS简介 Internet的快速增长使多媒体网络服务器面对的访问数量快速增加,服务器需要具备提供大量并发访问服务的能力,因此对于大负载的服务器来讲, CPU.I/O处理能力很快会成为瓶颈.由于单台服 ...

  7. Starting MySQL... ERROR! The server quit without updating PID file 问题解决

    今天遇到一个mysql起不来,不知为啥挂了,启动是下面的报错 Starting MySQL... ERROR! The server quit without updating PID file 后来 ...

  8. HDU 2553 N皇后问题(回溯 + 剪枝)

    本文链接:http://i.cnblogs.com/EditPosts.aspx?postid=5398797 题意: 在N*N(N <= 10)的方格棋盘放置了N个皇后,使得它们不相互攻击(即 ...

  9. Codeforces 1010D Mars rover

    题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少 解法:遍历图求各节 ...

  10. Java-静态代码块,构造代码块,构造函数

    静态代码块:用staitc声明,jvm加载类时执行,仅执行一次 构造代码块:类中直接用{}定义,每一次创建对象时执行. 执行顺序优先级:静态块, main(),函数,构造块,构造方法. 构造函数 pu ...