SetFileTime 设置文件修改时间有时不正确 ( 积分: 100 )

  • 主题发起人 主题发起人 tdp
  • 开始时间 开始时间
T

tdp

Unregistered / Unconfirmed
GUEST, unregistred user!
很奇怪,在有一台机器上,下面的函数返回成功,可修改时间会错1秒
比如:设置文件的修改时间为2007-1-8 16:42:5 结果为 2007-1-8 16:42:6
Function SetFileTime_LastWrite(FileName, lr_DateTime: string): Integer;
var
hFile : THandle;
WriteTime, LocalTime : TFILETIME;
SystemTime : TSystemTime;
begin
result:= 0;
try
hFile := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
if hFile <= 0 then
begin
result:= 1;
end else
begin
DateTimeToSystemTime(StrToDateTime(lr_DateTime), SystemTime);
SystemTimeToFileTime(SystemTime, LocalTime);
LocalFileTimeToFileTime(Localtime, WriteTime);

If not SetFileTime(hFile, nil, nil, @WriteTime) then
begin
result:= 2;
end;
end;
finally
FileClose(hFile);
end;
end;
 
转换误差,记得是最多有1秒钟。如果你换一个时间,可能就又对了。
 
我这儿可以啊!
没有问题:
if self.OpenDialog1.Execute then
if SetFileTime_LastWrite(opendialog1.FileName,'2006-12-29 12:00:00')=0 then
messagebox(0,'Ok','Ok',0);
 
转换误差是哪一步出现的,有没有办法避免?
 
帮你顶一下
 
没有人知道吗?
 
SetFileTime(hFile, CreateTime, AccessDate, LastWriteTime)
CreateTime - 创建时间
AccessDate - 访问日期
LastWriteTime - 修改时间
创建时间精确到秒
修改时间精确到2秒(总是偶数)
这是 WinAPI 函数 SetFileTime 的特性。
 
看来比较文件修改时间的作法不是太可靠,看看MSDN的正解
Not all file systems can record creation and last access times and not all file systems record them in the same manner. For example, on FAT, create time has a resolution of [red]10 milliseconds[/red], write time has a resolution of [red]2 seconds[/red], and access time has a resolution of [red]1 day [/red](really, the access date). Therefore, the GetFileTime function may not return the same file time information set using SetFileTime. NTFS delays updates to the last access time for a file by up to one hour after the last access.

大家平时用什么标准确定文件是否修改
 
文件是否被修改用判断文件的 MD5 值较好。
 
Kaida说的对,以前的文件时间只能是偶数.不过XP可以为奇数了.
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
539
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部