type EFileInfo = Exception; TLangInfoBuffer = array [1 .. 4] of SmallInt;
TFileInfo = class private FSearchRec: TSearchRec; FVerBlk: TVSFixedFileInfo; FFileName: string; function GetFileVersion(AFileName: string): Boolean;
function GetVersionString: string; function GetOS: string; function GetPath: string; function GetFileName: string; function GetName: string; function GetDosFileName: string; function GetFileExt: string; function GetFileType: string; function GetFileSize: LongInt; function GetIsDebugBuild: Boolean; function GetIsPreRelease: Boolean; function GetIsPrivateBuild: Boolean; function GetIsSpecialBuild: Boolean; function GetIsDirectory: Boolean; function GetIsHidden: Boolean; function GetIsSystemFile: Boolean; function GetIsArchive: Boolean; function GetCreationTime: TDateTime; function GetLastAccessed: TDateTime; function GetLastWritten: TDateTime; public constructor Create(AFileName: string); destructor Destroy; override;
constructor TFileInfo.Create(AFileName: string); begin inherited Create; FFileName := AFileName; if FindFirst(AFileName, faReadOnly + faHidden + faSysFile + faDirectory + faArchive + faAnyFile, FSearchRec) <> 0 then RaiseLastOSError; end;
destructor TFileInfo.Destroy; begin FindClose(FSearchRec); end;
function TFileInfo.GetFileVersion(AFileName: string): Boolean; var InfoSize, puLen: DWord; Pt, InfoPtr: Pointer; begin InfoSize := GetFileVersionInfoSize(PChar(AFileName), puLen); FillChar(FVerBlk, SizeOf(TVSFixedFileInfo), 0); if InfoSize > 0 then begin GetMem(Pt, InfoSize); GetFileVersionInfo(PChar(AFileName), 0, InfoSize, Pt); VerQueryValue(Pt, '\', InfoPtr, puLen); Move(InfoPtr^, FVerBlk, SizeOf(TVSFixedFileInfo)); FreeMem(Pt); Result := True; end else Result := False; end;
function TFileInfo.GetVersionString: string; begin if GetFileVersion(FFileName) then Result := Format('%u.%u.%u.%u', [HiWord(FVerBlk.dwProductVersionMS), LoWord(FVerBlk.dwProductVersionMS), HiWord(FVerBlk.dwProductVersionLS), LoWord(FVerBlk.dwProductVersionLS)]) else Result := ''; end;
function TFileInfo.GetIsDebugBuild: Boolean; begin Result := False; if GetFileVersion(FFileName) then Result := (FVerBlk.dwFileFlagsMask and FVerBlk.dwFileFlags and VS_FF_DEBUG) <> 0; end;
function TFileInfo.GetIsPreRelease: Boolean; begin Result := False; if GetFileVersion(FFileName) then Result := (FVerBlk.dwFileFlagsMask and FVerBlk.dwFileFlags and VS_FF_PRERELEASE) <> 0; end;
function TFileInfo.GetIsPrivateBuild: Boolean; begin Result := False; if GetFileVersion(FFileName) then Result := (FVerBlk.dwFileFlagsMask and FVerBlk.dwFileFlags and VS_FF_PRIVATEBUILD) <> 0; end;
function TFileInfo.GetIsSpecialBuild: Boolean; begin Result := False; if GetFileVersion(FFileName) then Result := (FVerBlk.dwFileFlagsMask and FVerBlk.dwFileFlags and VS_FF_SPECIALBUILD) <> 0; end;
function TFileInfo.GetOS: string; begin if GetFileVersion(FFileName) then case FVerBlk.dwFileOS of VOS_DOS_WINDOWS16: Result := 'MS-DOS or 16 bit Windows'; VOS_DOS_WINDOWS32: Result := '32 bit Windows'; VOS_OS216_PM16: Result := '16 bit OS/2'; VOS_OS232_PM32: Result := '32 bit OS/2'; VOS__WINDOWS32: Result := 'Win32 or Windows NT'; else Result := 'Unknown OS'; end else Result := ''; end;
function TFileInfo.GetFileType: string; var S: string; begin S := ''; if GetFileVersion(FFileName) then begin case FVerBlk.dwFileType of VFT_APP: S := 'Application'; VFT_DLL: S := 'Dynamic Link Library (DLL)'; VFT_DRV: begin S := 'Device Driver - '; case FVerBlk.dwFileSubtype of VFT2_DRV_PRINTER: S := S + 'Printer'; VFT2_DRV_KEYBOARD: S := S + 'Keyboard'; VFT2_DRV_LANGUAGE: S := S + 'Language'; VFT2_DRV_DISPLAY: S := S + 'Display'; VFT2_DRV_MOUSE: S := S + 'Mouse'; VFT2_DRV_NETWORK: S := S + 'Network'; VFT2_DRV_SYSTEM: S := S + 'System'; VFT2_DRV_INSTALLABLE: S := S + 'Installable'; VFT2_DRV_SOUND: S := S + 'Sound'; else S := S + 'Unknown'; end; end; VFT_FONT: begin S := 'Font File - '; case FVerBlk.dwFileSubtype of VFT2_FONT_RASTER: S := S + 'Raster'; VFT2_FONT_VECTOR: S := S + 'Vector'; VFT2_FONT_TRUETYPE: S := S + 'TrueType'; else S := S + 'Unknown'; end; end; VFT_VXD: S := 'Virtual Device'; VFT_STATIC_LIB: S := 'Static Link Library'; else S := 'Unknown File Type'; end; end; Result := S; end;
function TFileInfo.GetPath: string; begin Result := ExtractFilePath(FFileName); end;
function TFileInfo.GetFileName: string; begin Result := ExtractFileName(FFileName); end;
function TFileInfo.GetName: string; begin if Pos(FileExt, FileName) >= 0 then Result := Copy(FileName, 0, Pos(FileExt, FileName) - 1) else Result := FileName; end;
function TFileInfo.GetDosFileName: string; begin Result := StrPas(FSearchRec.FindData.cAlternateFileName) end;
function TFileInfo.GetFileExt: string; begin Result := ExtractFileExt(FFileName); end;
function TFileInfo.GetIsDirectory: Boolean; begin Result := FSearchRec.Attr and faDirectory = faDirectory; end;
function TFileInfo.GetIsHidden: Boolean; begin Result := FSearchRec.Attr and faHidden = faHidden; end;
function TFileInfo.GetIsSystemFile: Boolean; begin Result := FSearchRec.Attr and faSysFile = faSysFile; end;
function TFileInfo.GetIsArchive: Boolean; begin Result := FSearchRec.Attr and faArchive = faArchive; end;
function TFileInfo.GetFileSize: LongInt; begin Result := FSearchRec.Size; end;
function TFileInfo.GetCreationTime: TDateTime; var LTime: TFileTime; Systemtime: TSystemtime; begin FileTimeToLocalFileTime(FSearchRec.FindData.ftCreationTime, LTime); FileTimeToSystemTime(LTime, Systemtime); Result := SystemTimeToDateTime(Systemtime); end;
function TFileInfo.GetLastAccessed: TDateTime; var LTime: TFileTime; Systemtime: TSystemtime; begin FileTimeToLocalFileTime(FSearchRec.FindData.ftLastAccessTime, LTime); FileTimeToSystemTime(LTime, Systemtime); Result := SystemTimeToDateTime(Systemtime); end;
function TFileInfo.GetLastWritten: TDateTime; var LTime: TFileTime; Systemtime: TSystemtime; begin FileTimeToLocalFileTime(FSearchRec.FindData.ftLastWriteTime, LTime); FileTimeToSystemTime(LTime, Systemtime); Result := SystemTimeToDateTime(Systemtime); end;
function TFileInfo.Execute: Integer; begin Result := ShellExecute(Application.Handle, 'open', PChar(FFileName), '', PChar(Path), SW_SHOWDEFAULT); end;