设置文件修改时间为什么有时不是多一秒就是少一秒?富翁们帮帮忙!!!(100分)

  • 主题发起人 主题发起人 caojianli
  • 开始时间 开始时间
C

caojianli

Unregistered / Unconfirmed
GUEST, unregistred user!
两种设置修改时间函数如下:
第一种:
function SetFileDate (TheFileName: string; aDate: string):boolean;
Var
f : HFile;//integer;
ST : TSystemTime;
FT : TFileTime;
Begin
DateTimeToSystemTime(StrToDateTime (aDate), ST);
SystemTimeToFileTime(ST, FT);
LocalFileTimeToFileTime(FT, FT);
f := FileOpen (TheFileName, fmOpenReadWrite or fmShareDenyNone);
Try
SetFileTime(f, @FT, @FT, @FT);
//FileSetDate (f, DateTimeToFileDate ((StrToDateTime (aDate))));
Finally
FileClose (f);
result:=false;
End
End;
第二种:
function SetFileDate (TheFileName: string; aDate: string):boolean;
Var
f : integer;
Begin
f := FileOpen (TheFileName, fmOpenReadWrite);
Try
FileSetDate (f, DateTimeToFileDate ((StrToDateTime (aDate))));
Finally
FileClose (f);
result:=false;
End
End;
试验时间为:2006-08-01 04:34:49 2006-08-01 04:34:53 2006-08-01 04:34:56
2006-08-01 04:34:56这个对 其他两个不对不是多一秒就是少一秒![?]
 
光看不回 !!![:(] 我自己顶 !!!!大家帮忙找找原因好吗?
 
是不屑回答吗?[:(] 我觉得是不是FileClose (f);时把文件时间给变了?
 
有可能是 FileClose 时把时间改了.

你用 FindFirstFile 来得到那个句柄呢
 
恩 我试试!多谢支持![:)]
 
是这个命令惹的祸:
function DateTimeToFileDate(DateTime: TDateTime): Integer;
进行转换以后,下面两个日期变成整数以后都是一个整数值,
'2008-1-1 12:01:10'=941711397
'2008-1-1 12:01:11'=941711397
这个时候你的修改的文件时间当然会相差1秒钟。
 
TO:zywcd
你好! 那能有啥解决方法吗?[:)]
 
用 FindFirstFile 来得到那个句柄 修改不了时间
 
不知道可以有什么办法。系统转换的时候使用int,这样总会去掉小数,这个时候的精度就可能会差1秒钟。
 
to:zywcd
是不是 通过这个函数设置的日期秒数都为偶数?
 
这个没有测试,看取整的情况吧。可以1秒钟1秒钟的加测试看看。
 
一秒没有关系
 
to:网中戏 要是没关系我也就不问了!这个是和文件大小一起,
用来比较文件是否更新的!谢谢你的参与!能给个解决办法吗?
to:zywcd
我试了试!第一种函数多一秒;第二种函数少一秒!!我现在先
暂时把时间最后的秒数都转为偶数用呢!文件太多影响速度!!
 
时间转换以后只能整数,真的不知道应该怎么处理了。除非你重新写FileSetDate 这个函数。
 
请问,如果两个文件的更新间隔不超过一秒,大小又一样,您如何处理???
另外不明白,比较文件是否更新与设置修改时间有何关系?照理解,比较文件是否更新应是读取而不是设置呀?
 
to WickedladII
对于:如果两个文件的更新间隔不超过一秒,大小又一样,您如何处理???
服务器控制文件的日期一秒之内是不会有变化的顶多是半天变化一些文件!
从一台机器下载到另一台机子 文件时间会变的!复制方式时两台机子时间不一样文件时间
也会变!
 
偶有点明白你的意思了,
这是一个类似千年虫的bug,据MSDN上的资料来看,应该是由于win32中文件时间的存储方式造成的,微软只用了5位来计算秒数。

偶去国外的一些论坛瞧了瞧,挺多人发现了这个问题,不过到目前为止好像无解。

未来的Longhorn应该不会有此问题。另外,Delphi里很多函数其实都落后了,当然他们不赚钱,也不能怪他们了~~~是偶们自己的报应~~~。。。。。。
 
我刚好做了一个。

是用 CreateFile 来得到句柄的。
时间要先转成 SystemTime
再把 SystemTime 转成 LocalFileTime
再把 LocalFileTime 转成 FileTime 再写才行。

代码没在这里
明天我发上来
 
应该容易解决的阿;

来一段;

循环,查询文件A的日期时间,
如果比规定的 > 1秒以上,设一次文件时间;
如果比规定的 > 1秒,设一次文件时间-1 ;标记 B =真;
如果比规定的 > 1秒 and B=真,设一次文件时间-2 ;
类推;
如果比规定的 相等,退出循环;
循环end

意思就是弄到它爽为止(设置指定时间);
 
这是我的代码.你试试行不行都说一声哈.


procedure SetFileLastTime(StrFile:string; LastTime:TDateTime);
var
fHandle:THandle;
CreateTime: TFILETIME;
AccessTime: TFileTime;
WriteTime : TFileTime;
systime:TSystemTime;
begin
fHandle := CreateFile(PChar(StrFile),GENERIC_READ or GENERIC_WRITE,
0,nil, FILE_SHARE_READ or FILE_SHARE_WRITE,
OPEN_EXISTING ,FILE_ATTRIBUTE_NORMAL
);
if fHandle = INVALID_HANDLE_VALUE then exit;

GetFileTime(fHandle,@CreateTime, @AccessTime, @WriteTime);
DateTimeToSystemTime(LastTime,systime);
SystemTimeToFileTime(systime,writetime);
LocalFileTimeToFileTime(WriteTime,WriteTime);
SetFileTime(fHandle,@CreateTime, @AccessTime, @WriteTime);
CloseHandle(fHandle);
end;
 
后退
顶部