欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]VC控制台修改文件时间属性

[原创]VC控制台修改文件时间属性

最近对VC实现修改文件创建、访问、修改时间属性的方法产生了兴趣,我便在网上查了这方面的教程,但是却总是看不明白,有的不够简洁。例如在一些文章中提到了使用FindFirstFile()函数和WIN32_FIND_DATA结构,我认为完全没有必要,因为到最后时我们需要用到SetFileTime()函数,而这个函数和FindFirstFile()是无关的,我们只需用到SYSTEMTIME和FILETIME结构体。如果感兴趣的话,你可以先看看微软的官方帮助和支持文档:FILETIME 结构使用信息,里面讲的不仅仅是FILETIME 结构的使用,很值得一看。

struct _FILETIME {     //结构体定义
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;}
 FILETIME;
//FILETIME 结构表示 1601 年 1 月 1 日以来 100 纳秒为间隔数。结构包含的这两个DWORD值组合在一起
//形成一个 64 位值的 32 位值。 
struct _SYSTEMTIME {     //这个结构体的成员实际上查查字典就知道什么意思了,呵呵
    WORD wYear ;   //年
    WORD wMonth ;//月
    WORD wDayOfWeek ;
     //星期,0=星期日,1=星期一...
    WORD wDay ;     //日
    WORD wHour ;    //时
    WORD wMinute ;    //分
    WORD wSecond ;    //秒
    WORD wMilliseconds ;   //毫秒
}SYSTEMTIME; 

头文件:windows.h
接着定义变量。
    FILETIME Filetime;
    SYSTEMTIME Systemtime;
 
        接着,设置日期和时间,我们这里设置成1999年1月1日 01:01:01:
    Systemtime.wDay = 1;
    Systemtime.wYear = 1999;
   //一定要大于1601,因为FILETIME的时间是从1601年1月1日开始
   //如果不大于1601,SetFileTime()会返回false,GetLastError()
   //返回78 (无效参数)    
    Systemtime.wMonth = 1;
    Systemtime.wHour = 1;
    Systemtime.wMinute =1;
    Systemtime.wDayOfWeek = 1;
    Systemtime.wSecond = 1;
    Systemtime.wMilliseconds = 1;

    转换SystemTime为Filetime结构:
    SystemTimeToFileTime( &Systemtime, &Filetime ); 

    由于SetFileTime()需要文件句柄,所以只好用CreateFile()打开这个文件(微软官方实例)
     HANDLE hFile = CreateFile( "C:\\测试.txt",GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
    总算快完成了,但是还有最关键的一步(写入):
    if (hFile != INVALID_HANDLE_VALUE)
    {
         SetFileTime( hFile, &Filetime, &Filetime, &Filetime );
        CloseHandle(hFile);
    }

     注:SetFileTime函数函数原型:
BOOL SetFileTime(   //返回值:TRUE表示成功,FALSE表示失败
     HANDLE hFile,                     // 文件句柄
     CONST FILETIME *lpCreationTime,   // 文件创建时间
     CONST FILETIME *lpLastAccessTime, // 最后访问时间
     CONST FILETIME *lpLastWriteTime   // 最后修改时间
   );

    你运行试试看,是不是OK了?不,远远不是。我们来看看程序运行后文件的创建
    你会问,怎么是1999年1月1日,9:01:01?我们明明设置的是1999年1月1日,1:01:01啊!这个问题我也纠结了好半天,最后总算找到了答案:时区!    我国标准北京时间是GMT+8:00,所以你只要把时间GMT标准之间就可以了,不过还得再说明一下,如果你调成GMT(格林威治时间)的话,还是会有1小时的误差,也就是说Microsoft Windows的文件时间不是按的GMT(格林威治时间)来计算的。我们只要把时区调成GMT(协调世界时)就可以了。    或者,在程序中这样修改一下:
     Systemtime.wDay = 31;
     Systemtime.wYear = 1998; 
    Systemtime.wMonth = 12;
     Systemtime.wHour = 17;
     Systemtime.wMinute = 1;
     Systemtime.wDayOfWeek = 1;
     Systemtime.wSecond = 1;
     Systemtime.wMilliseconds = 1;

     就可以了。
    范例下载地址:(<a href='http://yunpan.cn/Q5vVVMqSBnbsT'>360云盘</a>)
    转载请注明:http://sunnysab.blog.163.com/
实际上这篇文章是我原创的,sunnysab.blog.163.com是我博客
更好的排版,请访问:http://sunnysab.blog.163.com/blog/static/18037500920134221295425/

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功