UPD: Use NtQueryInformationFile to get file change time

This commit is contained in:
Alexander Koblov 2017-03-18 20:31:32 +00:00
commit 35276ca09d
2 changed files with 17 additions and 30 deletions

View file

@ -770,9 +770,8 @@ begin
fpModificationTime,
{$IF DEFINED(MSWINDOWS)}
fpCreationTime,
{$ELSE}
fpChangeTime,
{$ENDIF}
fpChangeTime,
fpLastAccessTime,
uFileProperty.fpLink,
fpOwner,
@ -782,9 +781,6 @@ begin
, fpCompressedSize
{$ENDIF}
];
{$IF DEFINED(MSWINDOWS)}
if CheckWin32Version(6, 1) then Result += [fpChangeTime];
{$ENDIF}
end;
function TFileSystemFileSource.CreateListOperation(TargetPath: String): TFileSourceOperation;

View file

@ -567,6 +567,22 @@ begin
Int64Rec(Result).Lo:= GetCompressedFileSizeW(PWideChar(UTF16LongName(FileName)), @Int64Rec(Result).Hi);
end;
function mbGetFileChangeTime(const FileName: String; out ChangeTime: TFileTime): Boolean;
var
Handle: System.THandle;
IoStatusBlock : TIoStatusBlock;
FileInformation: TFileBasicInformation;
begin
Handle:= CreateFileW(PWideChar(UTF16LongName(FileName)), FILE_READ_ATTRIBUTES,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if Handle = INVALID_HANDLE_VALUE then Exit(False);
Result:= NtQueryInformationFile(Handle, @IoStatusBlock, @FileInformation,
SizeOf(FileInformation), FileBasicInformation) = 0;
CloseHandle(Handle);
ChangeTime:= TFileTime(FileInformation.ChangeTime);
end;
type
TOKEN_ELEVATION_TYPE = (
TokenElevationTypeDefault:= 1, TokenElevationTypeFull,
@ -598,31 +614,6 @@ function GetTokenInformation(TokenHandle: HANDLE; TokenInformationClass: TOKEN_I
TokenInformation: Pointer; TokenInformationLength: DWORD;
out ReturnLength: DWORD): BOOL; stdcall; external 'advapi32' name 'GetTokenInformation';
function mbGetFileChangeTime(const FileName: String; out ChangeTime: TFileTime): Boolean;
var
Handle: System.THandle;
lpFileInformation: TFileBasicInformation;
GetFileInformationByHandleEx: function(hFile: THandle; FileInformationClass: DWORD;
lpFileInformation: LPVOID; dwBufferSize: DWORD): BOOL; stdcall;
begin
Result:= CheckWin32Version(6, 1);
if Result then
begin
Pointer(GetFileInformationByHandleEx):= GetProcAddress(GetModuleHandle(Kernel32), 'GetFileInformationByHandleEx');
Result:= Assigned(GetFileInformationByHandleEx);
if Result then
begin
Handle:= CreateFileW(PWideChar(UTF16LongName(FileName)), FILE_READ_ATTRIBUTES,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if Handle = INVALID_HANDLE_VALUE then Exit(False);
Result:= GetFileInformationByHandleEx(Handle, 0, @lpFileInformation, SizeOf(lpFileInformation));
CloseHandle(Handle);
ChangeTime:= TFileTime(lpFileInformation.ChangeTime);
end;
end;
end;
function IsUserAdmin: LongBool;
var
ReturnLength: DWORD;