我使用Win32 API来获取文件的日期和时间。 我有一个LPSYSTEMTIME结构,我想打印其wYear变量。
我有一个函数(GetFileDate):
function GetFileDate : LPSYSTEMTIME
var
CheckFile: Long;
FileTime: LPFILETIME;
FileTimeReturn: LPFILETIME;
SystemTimeReturn: LPSYSTEMTIME;
begin
CheckFile := CreateFile(PChar('main.pas'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
GetFileTime(CheckFile, FileTime, NIL, NIL);
FileTimeToLocalFileTime(FileTime, FileTimeReturn);
FileTimeToSystemTime(FileTimeReturn, SystemTimeReturn);
GetFileDate := SystemTimeReturn;
end;
但是,当我做到这一点?
begin
Write(GetFileDate.wYear);
end.
它吐出回
main.pas(22,20) Error: Illegal qualifier main.pas(22,20) Fatal: Syntax error, ")" expected but "identifier WYEAR" found Fatal: Compilation aborted
任何帮助?
LPSYSTEMTIME
是一个指向SYSTEMTIME
结构。 尝试使用^
运算符取消引用该指针,例如:
Write(GetFileDate^.wYear);
要么:
Write(GetFileDate()^.wYear);
随着中说,除了一个事实,即你没有做任何错误处理可言,你GetFileDate()
实现传递错误的参数值的各种API函数。 该代码甚至不应该编译,正确更不用说跑。
试试这个:
function GetFileDate : SYSTEMTIME;
var
CheckFile: HANDLE;
FileTime: FILETIME;
FileTimeReturn: FILETIME;
SystemTimeReturn: SYSTEMTIME;
GetFileDateResult: SYSTEMTIME;
begin
ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
CheckFile := CreateFile('FullPathTo\main.pas', GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if CheckFile <> INVALID_HANDLE_VALUE then
begin
if GetFileTime(CheckFile, @FileTime, nil, nil) then
begin
if FileTimeToLocalFileTime(@FileTime, @FileTimeReturn) then
begin
if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
GetFileDateResult := SystemTimeReturn;
end;
end;
CloseHandle(CheckFile);
end;
GetFileDate := GetFileDateResult;
end;
begin
Write(GetFileDate.wYear);
end.
另外,我建议使用FindFirstFile()
代替CreateFile()
所以你不必打开文件只是为了得到它的日期。 文件系统可以提供的信息,例如:
function GetFileDate : SYSTEMTIME;
var
CheckFile: HANDLE;
FindFileData: WIN32_FIND_DATA;
FileTimeReturn: FILETIME;
SystemTimeReturn: SYSTEMTIME;
GetFileDateResult: SYSTEMTIME;
begin
ZeroMemory(@GetFileDateResult, SizeOf(GetFileDateResult));
CheckFile := FindFirstFile('FullPathTo\main.pas', @FindFileData);
if CheckFile <> 0 then
begin
if FileTimeToLocalFileTime(@FindFileData.ftCreationTime, @FileTimeReturn) then
begin
if FileTimeToSystemTime(@FileTimeReturn, @SystemTimeReturn) then
GetFileDateResult := SystemTimeReturn;
end;
FindClose(CheckFile);
end;
GetFileDate := GetFileDateResult;
end;