新浪博客

如何修改文件的创建时间、上次读取时间、修改时间?

2009-07-13 23:17阅读:
如何修改文件的创建时间、上次读取时间、修改时间?
在WINDOWS中,文件的创建时间、上次读取时间、修改时间是有操作系统来管理的,一般来说不允许用户自己修改。但也不是绝对的不能修改,系统函数SetFileTime()提供了修改上述文件三个特性时间的手段。
SetFileTime()有四个参数,第一个为文件的句柄,第二个为FILETIME结构的指针,用来描述文件的创建时间,NULL指无须修改文件的创建时间,第三个为FILETIME结构的指针,用来描述文件的上次读取时间时间,NULL指无须修改文件的上次读取时间,第四个为FILETIME结构的指针,用来描述文件的修改时间,NULL指无须修改文件的修改时间。
下面一段代码是个用C++写的小程序,指出了如何用命令行修改文件的修改时间。
#include 'stdafx.h'
#include 'windows.h'
#include 'iostream.h'
#include 'stdlib.h'
int main(int argc, char* argv[])
{
if (argc == 8)
{
FILETIME ft,ft1;
SYSTEMTIME systime;
int gxm1,gxm2,gxm3,gxm4,gxm5,gxm;
gxm=atoi(argv[7]);
gxm1=atoi(argv[2]);
gxm2=atoi(argv[3]);
gxm3=atoi(argv[4]);
gxm4=atoi(argv[5]);
gxm5=atoi(argv[6]);
systime.wYear = gxm1;
systime.wMonth = gxm2;
systime.wDay = gxm3;
systime.wHour = gxm4;
systime.wMinute = gxm5;
systime.wSecond = gxm;
systime.wMilliseconds=0;
Syste
mTimeToFileTime(&systime, &ft);
LocalFileTimeToFileTime(&ft,&ft1); //把时间转换UTC
HANDLE hFile;
hFile = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ| FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile== INVALID_HANDLE_VALUE)
{
printf('open't the file[!]...................................error');
}
SetFileTime(hFile, (LPFILETIME) NULL, (LPFILETIME) NULL, &ft1);
CloseHandle(hFile);
printf('changed[!]...................................OK');
return 0;
}
printf('修改文件最后修改日期工具');
printf('文件使用方法为:');
printf( '\t%s path year month Day Hour Minute Second',argv[0]);
return 0;
}
命令行分别输入文件名,修改时间的年月日时分秒,如何转换就不说了,因为很简单SystemTimeToFileTime()函数将系统时间转化为文件时间结构,LocalFileTimeToFileTime()函数将输入的本地时间转化为UTC格林尼制标准时(世界时)。CreateFile()函数获取文件的句柄,注意不要更改GENERIC_READ |
GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,OPEN_EXISTING。特别是OPEN_EXISTING选项不能少,如果没有该选项系统会删掉该文件。SetFileTime()函数仅修改了文件的修改时间。注意SetFileTime()执行完后立即关闭该文件(使用函数CloseHandle(hFile)),其它动作可能导致操作系统修改该文件的三个时间。修改创建时间和上次读取时间只需修改SetFileTime()一语句。 
  如果不明白argv[i]的含义,这里再提一下。argv[0]是当前可执行文件的文件名,argv[1]是要修改文件的路径名,其余为年月日时分秒。事实上如果不是8个参数,程序会提示你输入的格式。
  以上代码是结合互联网资料写的(感谢原始创新者),不过原程序有错误,一是时间秒减了一秒,二是没有对系统时间的毫秒字段赋值。(systime.wMilliseconds=0;)这在某些情况下会报错。
  请链接,不要转载,版权所有。

我的更多文章

下载客户端阅读体验更佳

APP专享