我调用如下函数,修改文件的时间,传入LastWriteTime为13:51:00,修改后看文件属性的修改时间确为21:51:02,为什么呢?
是我这段代码有问题吗?procedure SetFileTime(const FileName:string;
  const CreationTime,LastWriteTime,LastAccessTime: TDateTime);
var
  Fs:TFileStream;
  iCreationTime,iLastWriteTime,iLastAccessTime:TSystemTime;
  ftCreationTime,ftLastWriteTime,ftLastAccessTime:TFileTime;
begin
  DateTimeToSystemTime(CreationTime,iCreationTime);
  DateTimeToSystemTime(LastWriteTime,iLastWriteTime);
  DateTimeToSystemTime(LastAccessTime,iLastAccessTime);
  FS := Nil;
  try
    FS := TFileStream.Create(FileName, fmOpenReadWrite);
    SystemTimeToFileTime(iCreationTime, ftCreationTime);
    SystemTimeToFileTime(iLastWriteTime, ftLastWriteTime);
    SystemTimeToFileTime(iLastAccessTime, ftLastAccessTime);
    Windows.SetFileTime(FS.Handle,@ftCreationTime, @ftLastAccessTime, @ftLastWriteTime);
  finally
    FS.Free;
  end;
end;

解决方案 »

  1.   


    procedure SetFileTime(const FileName:string; 
      const CreationTime,LastWriteTime,LastAccessTime: TDateTime); 
    var 
      Fs:TFileStream; 
      iCreationTime,iLastWriteTime,iLastAccessTime:TSystemTime; 
      ftCreationTime,ftLastWriteTime,ftLastAccessTime:TFileTime; 
    begin 
      DateTimeToSystemTime(CreationTime,iCreationTime); 
      DateTimeToSystemTime(LastWriteTime,iLastWriteTime); 
      DateTimeToSystemTime(LastAccessTime,iLastAccessTime); 
      FS := Nil; 
      try 
        FS := TFileStream.Create(FileName, fmOpenReadWrite); 
        SystemTimeToFileTime(iCreationTime, ftCreationTime); 
        LocalFileTimeToFileTime(ftCreationTime,ftCreationTime);//将本地文件时间转为文件时间 
        SystemTimeToFileTime(iLastWriteTime, ftLastWriteTime); 
        LocalFileTimeToFileTime(ftCreationTime,ftLastWriteTime);//将本地文件时间转为文件时间 
        SystemTimeToFileTime(iLastAccessTime, ftLastAccessTime); 
        LocalFileTimeToFileTime(ftCreationTime,ftLastAccessTime);//将本地文件时间转为文件时间 
        Windows.SetFileTime(FS.Handle,@ftCreationTime, @ftLastAccessTime, @ftLastWriteTime); 
      finally 
        FS.Free; 
      end; 
    end;
      

  2.   

    最后得出一个结论,用SetFileTime修改文件时间,无法精确到秒级以下,只有秒和毫秒为0时,才是准确的,否则将出现偏差,不知我理解的对不对。
      

  3.   

    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 10 milliseconds, write time has a resolution of 2 seconds, and access time has a resolution of 1 day (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.