请教GetFileInformationByHandle函数的使用问题!(50分)

  • 主题发起人 主题发起人 DEN
  • 开始时间 开始时间
D

DEN

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做这样一个获取文件信息的程序:
;部分代码如下:
procedure TForm1.Button1Click(Sender: TObject);
;var
; ;FileOp : TOFStruct ;
; ;FHandle : THandle ;
; ;FInfo : TByHandleFileInformation ;
; ;dtCreate : TSystemTime;

begin
;memo1.clear;

;setlasterror(20);
;FHandle:= openfile(pchar(edit1.text),FileOp ,OF_READ);
;GetFileInformationByHandle(FHandle,FInfo);

; ;memo1.Lines.Add('File Attributes : ;'+inttostr(FInfo.dwFileAttributes));

; ;FileTimeToSystemTime(FInfo.ftCreationTime,dtCreate);
; ;memo1.Lines.Add('File Create Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );

; ;FileTimeToSystemTime(FInfo.ftLastAccessTime,dtCreate);
; ;memo1.Lines.Add('File Last Access Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );


; ;FileTimeToSystemTime(FInfo.ftLastWriteTime,dtCreate);
; ;memo1.Lines.Add('File Last Write Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );

; ;memo1.Lines.Add('File Path and Name : ;'+FileOp.szPathName);

;_lclose(FHandle);

end;
;
然而,所得到的文件系统时间却总比通过windows自己得到的时间(右击看文件属性得到)
少整8个小时,不知何故。这个问题已经困绕我一天了,请各位大侠帮忙看看!
虽然在msdn中有说:当filetime >= 0x8000000000000000 时此函数会工作不正常,但
windows是怎么做到的(我的环境是win2000简/繁体系统)?
 
呀,我们在东八区呀。。。[:)]
这应该是原因吧。
 
你系统设置为伦敦时间,看看情况,估计就会对了。[:D]
 
哈哈,正是!
我实验了,一改一切都乱了!!![:D][:D][:D]
 
谢谢楼上的大哥,我想应该也是这个原因,FileTimeToSystemTime转换后得到的是标准
0时区时间。 但我总不能去修改windows的时区设置吧。我有一个办法可以得到当前时区
的时间,原后再加上它们的差值。但这样做工作量太大了,因为在delphi中不能对时间
直接进行+/-运算。请问有什么更好的办法?
 
我给你重新写了一下,Ok了。
procedure TForm1.Button1Click(Sender: TObject);
;var
; ;FileOp : TOFStruct ;
; ;FHandle : THandle ;
; ;FInfo : TByHandleFileInformation ;
; ;dtCreate,dtCreate2 : TSystemTime;
; ;Temp:_FileTime;
begin
;memo1.clear;

;setlasterror(20);
;FHandle:= openfile(pchar(edit1.text),FileOp ,OF_READ);
;GetFileInformationByHandle(FHandle,FInfo);

; ;memo1.Lines.Add('File Attributes : ;'+inttostr(FInfo.dwFileAttributes));


; ;FileTimeToLocalFileTime(FInfo.ftCreationTime,Temp);
; ;FileTimeToSystemTime(Temp,dtCreate);


; ;memo1.Lines.Add('File Create Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );

; ;FileTimeToLocalFileTime(FInfo.ftLastAccessTime,Temp);
; ;FileTimeToSystemTime(Temp,dtCreate);


; ;memo1.Lines.Add('File Last Access Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );

; ;FileTimeToLocalFileTime(FInfo.ftLastWriteTime,Temp);
; ;FileTimeToSystemTime(Temp,dtCreate);

; ;memo1.Lines.Add('File Last Write Time : ;'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wYear)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMonth)+'-'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wDay)+' '
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wHour)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wMinute)+':'
; ; ; ; ; ; ; ; ;+inttostr(dtCreate.wSecond) );

; ;memo1.Lines.Add('File Path and Name : ;'+FileOp.szPathName);

;_lclose(FHandle);

end;
 
delphi中可以对时间直接进行+/-运算的
 
谢谢,我会给你加分的。
但我还想请教一下,用GetFileAttributesEx会使上面的程序变得很简单,也不会用那么多
的api,但我不知怎么用这个 function, 能告知一二吗?
 
使用Tp:TSearchRec; 申明Tp为一个查找记录
FindFirst(Tf,faAnyFile,Tp);
Tp.FindData.ftCreationTime
Tp.FindData.ftLastWriteTime
 
接受答案了!
 
问题结束,谢谢各位!
 
多人接受答案了。
 
后退
顶部