用api取文件時間的問題(100分)

  • 主题发起人 主题发起人 W1979
  • 开始时间 开始时间
W

W1979

Unregistered / Unconfirmed
GUEST, unregistred user!
我調Windows的API寫了一支程式﹐匿名登入FTP服務器找我要的文件﹐如果
發現文件有更新就下載.

我用FtpFindFirstFile取得了這個文件的TWin32FindData結構,
讀它的ftLastWriteTime:

var
WFD: TWin32FindData ;
'''
datetimetostr(FileDatetodatetime( DepartFileTime(WFD.ftLastWriteTime)))

其中DepartFileTime是我寫的一個函數,參考自SysUtil單元﹕

function DepartFileTime(FileTime:TFileTime):integer;
var year,month,day,hour,minute,second:string;
localFiletime:TFiletime;
begin
FileTimeToLocalFileTime(Filetime, LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
LongRec(Result).Lo) then Exit;

Result := -1;
end;

測試發現獲得的日期時間與實際不符,包括用該代碼連我本機﹐發現時間
比實際剛好快了8小時,請問是為什么?
 
我用该方法取没有问题

procedure TForm1.Button1Click(Sender: TObject);
var
FileHandle : Integer;
lpfiletime,localfiletime:TFileTime;
st:systemtime;
begin
FileHandle := FileOpen('d:/1.doc',fmShareDenyNone);
if FileHandle > 0 then
GetFileTime(

FileHandle, // identifies the file
@lpfiletime, // address of creation time
nil, // address of last access time
nil // address of last write time
);
fileclose(filehandle);
FileTimeToLocalFileTime(lpfiletime,localfiletime);
FileTimeToSystemTime(localfiletime,st);
edit1.text:=formatdatetime('yyyy-mm-dd hh:mm:ss.zzz',SystemTimeToDateTime(st));
end;
 
我不通過FTP﹐直接取本地文件時間也沒問題的

我用FtpFindFirstFile函數﹐它有一TWin32FindData結構﹐其中有一個ftLastWriteTime
從里面取時間。
 
大概是系统时区设置的问题吧,把服务器与自己的机器改成同一时区可能就好了
 
改了一下我用這種方法取時間 仍快八小時 本機的ftp服務器也一樣
不用ftp直接讀本地文件沒問題
FileTimeToLocalFileTime(ftLastWriteTime,localfiletime);
FileTimeToSystemTime(localfiletime, st);
result:=SystemTimeToDatetime(st);
 
你要看那台服务器是在哪儿,假如有8个小时的时差,或者服务器的时间设错了,你也没法。
因为你试自己的机器没有问题。你可以试试你自己能控制的其它机器,若也没有问题,那
就说明你的程序没有问题。若时差问题还可以解决,若是那台服务器时间有错,你又控制不
了,那你就没法啦。
 
不對呀﹐我那台服務器就放在我面前﹐而且我連在自己電腦上設的ftp服務器
一樣快8個小時
我連FTP,取文件的時間,FtpFindFirstFile()返回一個TWin32FindData結構﹐其中
ftLastWriteTime(TFiileTime類型)是文件時間,我用:

function DepartFileTime(FileTime:TFileTime):TDatetime;
var localFiletime:TFiletime;
st:systemtime;
begin
FileTimeToLocalFileTime(FileTime,localfiletime);
FileTimeToSystemTime(localfiletime, st);
result:=SystemTimeToDatetime(st);
end;

以上代碼不通過FTP,直接讀一個本地文件又沒問題[:(]
 
是这样的,Delphi要给你加八个小时,你自己减下来就是了。
 
問了李穎﹐李大師答曰﹐我取的是universal 什么什么 時間,也就是格林尼冶時間,
去掉FileTimeToLocalFileTime(FileTime,localfiletime);就好了.

再來一個湊足五個我好給分大酬賓的說
 
呵呵,我来补位:)
 
BTW:为什么四个不行,一定要五个才好给分?:)
 
多人接受答案了。
 
后退
顶部