如何将 TFileTime 转换成 TDateTime ?(200分)

  • 主题发起人 主题发起人 Adayuer
  • 开始时间 开始时间
A

Adayuer

Unregistered / Unconfirmed
GUEST, unregistred user!
或者直接给出 取的 文件创建时间/最后访问时间/最后修改时间 也可以!

谢谢
 
贴个别人的代码,自己不想搞了
// 取得文件创建时间
function GetFileCreationTime(const FileName: String): TDateTime;
var
FileTime: TFileTime;
LocalFileTime: TFileTime;
hFile: THandle;
SystemTime: TSystemTime;
begin
Result := 0;
FileTime.dwLowDateTime := 0;
FileTime.dwHighDateTime := 0;
hFile := FileOpen(FileName, fmShareDenyNone);
try
if hFile <> 0 then
begin
Windows.GetFileTime(hFile, @FileTime, nil, nil);
FileTimeToLocalFileTime(FileTime, LocalFileTime);
FileTime := LocalFileTime;
end;
finally
FileClose(hFile);
end;
if FileTimeToSystemTime(FileTime, SystemTime) then
Result := SystemTimeToDateTime(SystemTime);
end;


 
没有试过
但是可以肯定是用API函数
 
uses Windows,ShellAPI;

// ================================================================
// Return the three dates (Created,Modified,Accessed)
// of a given filename. Returns FALSE if file cannot
// be found or permissions denied. Results are returned
// in TdateTime VAR parameters
// ================================================================

function GetFileTimes(FileName : string;
var Created : TDateTime;
var Modified : TDateTime;
var Accessed : TDateTime) : boolean;
var FileHandle : integer;
Retvar : boolean;
FTimeC,FTimeA,FTimeM : TFileTime;
LTime : TFileTime;
STime : TSystemTime;
begin
FileHandle := FileOpen(FileName,fmShareDenyNone);
Created := 0.0;
Modified := 0.0;
Accessed := 0.0;

if FileHandle < 0 then
RetVar := false
else begin
RetVar := true;
GetFileTime(FileHandle,@FTimeC,@FTimeA,@FTimeM);
FileClose(FileHandle);

// Created
FileTimeToLocalFileTime(FTimeC,LTime);
if FileTimeToSystemTime(LTime,STime) then begin
Created := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
Created := Created + EncodeTime(STime.wHour,STime.wMinute,STime.wSecond,STime.wMilliSeconds);
end;

// Accessed
FileTimeToLocalFileTime(FTimeA,LTime);
if FileTimeToSystemTime(LTime,STime) then begin
Accessed := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
Accessed := Accessed + EncodeTime(STime.wHour,STime.wMinute,STime.wSecond,STime.wMilliSeconds);
end;

// Modified
FileTimeToLocalFileTime(FTimeM,LTime);
if FileTimeToSystemTime(LTime,STime) then begin
Modified := EncodeDate(STime.wYear,STime.wMonth,STime.wDay);
Modified := Modified + EncodeTime(STime.wHour,STime.wMinute,STime.wSecond,STime.wMilliSeconds);
end;

end;

Result := RetVar;
end;




procedure Test;
var CDate,MDate,ADate : TDateTime;
begin
if GetFileTimes('c:/autoexec.bat',CDate,MDate,ADate) then begin
Label1.Caption := FormatDateTime('dd/mm/yyyy hh:nn',CDate);
Label2.Caption := FormatDateTime('dd/mm/yyyy hh:nn',MDate);
Label3.Caption := FormatDateTime('dd/mm/yyyy hh:nn',ADate);
end;
end;
 
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
SysTime: TSystemTime;
begin
if not FileTimeToSystemTime(FileTime,SysTime) then
raise EConvertError.CreateFmt('FileTimeToSystemTime failed. ' +
'Error code %d', [GetLastError]);
with SysTime do
Result := EncodeDate(wYear, wMonth, wDay) +
EncodeTime(wHour, wMinute, wSecond, wMilliseconds)
end;


function DateTimeToFileTime(DateTime: TdateTime): TFileTime;
var
SysTime: TSystemTime;
begin
with SysTime do
begin
DecodeDate(DateTime, wYear, wMonth, wDay);
DecodeTime(DateTime, wHour, wMinute, wSecond, wMilliseconds);
wDayOfWeek := DayOfWeek(DateTime);
end;

if not SystemTimeToFileTime(SysTime, Result) then
raise EConvertError.CreateFmt('SystemTimeToFileTime failed. ' +
'Error code %d', [GetLastError]);
end;

以上摘自《Delphi5开发人员指南》314页
 
后退
顶部