서버에 있는 파일과 로컬에 있는 파일의 '최종수정시간'을 비교하기 위해,
서버에선 php에서 filemtime 함수를 이용해 최종수정시간을 출력하고,
로컬에선 Delphi의 GetFileTime, DateTimeToUnix 를 이용하여 최종수정시간을 출력했는데,
이게 안맞았다.
이리저리 살펴본 결과 php의 filemtime은 GMT를 계산하지 않은 값이고,
로컬의 값은 GMT를 계산한 값이었다.
한국이니까 GMT+9 가 되어 있는 값이었다. 그러므로 -9시간을 해줘야 함.
GMT를 구해서 빼고 더하고 해서 php와 Delphi의 값을 맞춘다.
// TFileTime -> TDateTime
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
ModifiedTime: TFileTime;
SystemTime: TSystemTime;
begin
FileTimeToLocalFileTime(FileTime, ModifiedTime);
FileTimeToSystemTime(ModifiedTime, SystemTime);
Result:=SystemTimeToDateTime(SystemTime);
end;
// GMT 값
function GetTimeZone: Integer;
var TimeZone: TTimeZoneInformation;
begin
GetTimeZoneInformation(TimeZone);
Result:=TimeZone.Bias div 60;
end;
// FilePath 파일의 최종수정시각을 UnixTime으로 반환. 파일이 없으면 -1
function GetModifiedUnixTime(FilePath: String): Integer;
var
SR: TSearchRec;
hFile: THandle;
tCreate, tAccess, tModified: TFileTime;
begin
Result:=-1;
if not FileExists(FilePath) then Exit;
hFile:=FileOpen(FilePath, fmOpenRead or fmShareDenyNone);
GetFileTime(hFile, @tCreate, @tAccess, @tModified);
Result:=DateTimeToUnix(IncHour(FileTimeToDateTime(tModified), GetTimeZone));
FileClose(hfile);
FindClose(SR);
end;
function FileTimeToDateTime(FileTime: TFileTime): TDateTime;
var
ModifiedTime: TFileTime;
SystemTime: TSystemTime;
begin
FileTimeToLocalFileTime(FileTime, ModifiedTime);
FileTimeToSystemTime(ModifiedTime, SystemTime);
Result:=SystemTimeToDateTime(SystemTime);
end;
// GMT 값
function GetTimeZone: Integer;
var TimeZone: TTimeZoneInformation;
begin
GetTimeZoneInformation(TimeZone);
Result:=TimeZone.Bias div 60;
end;
// FilePath 파일의 최종수정시각을 UnixTime으로 반환. 파일이 없으면 -1
function GetModifiedUnixTime(FilePath: String): Integer;
var
SR: TSearchRec;
hFile: THandle;
tCreate, tAccess, tModified: TFileTime;
begin
Result:=-1;
if not FileExists(FilePath) then Exit;
hFile:=FileOpen(FilePath, fmOpenRead or fmShareDenyNone);
GetFileTime(hFile, @tCreate, @tAccess, @tModified);
Result:=DateTimeToUnix(IncHour(FileTimeToDateTime(tModified), GetTimeZone));
FileClose(hfile);
FindClose(SR);
end;
'Delphi' 카테고리의 다른 글
[Delphi] DLL Injection 후에 폼을 다른 윈도우의 Dialog 처럼 띄우기 (0) | 2010.05.14 |
---|---|
[Delphi] 보이지 않는 콘솔 프로젝트 (invisible console) (0) | 2010.05.06 |
[Delphi] 로컬 파일 크기 가져오기 (0) | 2010.05.06 |
[Delphi] 핫키 등록하고 내가 쓰기 (0) | 2010.05.04 |
[Delphi] ContextMenu, FindWindow (0) | 2010.04.29 |