15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Получаем всю информацию о файле.

Автор: Brian Pedersen

Совместимость: Delphi 3.x (или выше)

Данный объект может быть использован для получения исчерпывающей информации о любом файле. Так же включена функция выполнения файла Execute().

Использование: создайте объект с именем файла или путём

unit FileInfo;

interface
{ ---------------------------------------------------------------------------- }

uses
  forms, shellapi, windows, sysutils;

type
  EFileInfo = exception;
  TLangInfoBuffer = array [1..4] of SmallInt;
  TFileInfo = class
    private
      f : TSearchRec;
      fVerBlk : TVSFixedFileInfo;
      fFileName : string;
      function GetFileVersion( AFileName : string ) : boolean;
    public
      constructor Create( AFileName : string ); // Создаём объект
      destructor  Destroy; override;
      function    Execute : integer;            // Открывает файл в программе, связанной с ним
      function    VersionString : string;       // Версия файла. Строка пустая, если строка не найдена
      function    OS : string;                  // Операционная система
      function    Path : string;                // Путь файла
      function    FileName : string;            // Имя файла
      function    Name : string;                // Имя файла без расширения
      function    DosFileName : string;         // Имя файла в DOS
      function    FileExt : string;             // Расширение файла
      function    FileType : string;            // Тип файла
      function    FileSize : longint;           // Размер файла
      function    isDebugBuild : boolean;       // True если флаг отладки (debug build) установлен
      function    isPreRelease : boolean;       // True если флаг prerelease установлен
      function    isPrivateBuild : boolean;     // True если флаг private установлен
      function    isSpecialBuild : boolean;     // True если флаг special build установлен
      function    isDirectory : boolean;        // True если файл является директорией
      function    isHidden : boolean;           // True если файл является скрытым (hidden)
      function    isSystemFile : boolean;       // True если файл является системным
      function    isVolumeId : boolean;         // True если файл является меткой тома
      function    isArchive : boolean;          // True если файл является архивом
      function    CreationTime : TDateTime;     // Время создания файла
      function    LastAccessed : TDateTime;     // Время последнего доступа к файлу
      function    LastWritten : TDateTime;      // Время последней записи в файл
  end;

{ ---------------------------------------------------------------------------- }
  implementation
{ ---------------------------------------------------------------------------- }

constructor TFileInfo.Create( AFileName : string );
var
  ret : integer;
begin
  inherited Create;
  fFileName := AFileName;
  ret := FindFirst( AFileName, faReadOnly + faHidden+ faSysFile + faVolumeID +
                    faDirectory + faArchive + faAnyFile, f );
  if ret <> 0 then
    SysUtils.RaiseLastWin32Error;
end;

{ ---------------------------------------------------------------------------- }
destructor TFileInfo.Destroy;
begin
  FindClose( f );
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.VersionString : 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.isDebugBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
              VS_FF_DEBUG) <> 0
end;

{ ---------------------------------------------------------------------------- }
function TFIleInfo.isPreRelease : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
              VS_FF_PRERELEASE) <> 0
end;

{ ---------------------------------------------------------------------------- }
function TFIleInfo.isPrivateBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
              VS_FF_PRIVATEBUILD) <> 0
end;

{ ---------------------------------------------------------------------------- }
function TFIleInfo.isSpecialBuild : boolean;
begin
  result := FALSE;
  if GetFileVersion( fFileName ) then
    result := (fVerBlk.dwFileFlagsMask and fVerBlk.dwFileFlags and
              VS_FF_SPECIALBUILD) <> 0
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.OS : 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_NT_WINDOWS32  : result := 'Win32 or Windows NT';
    else
      result := 'Unknown OS';
    end
  else
    result := '';
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.FileType : 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.Path : string;
begin
  result := ExtractFilePath( fFileName );
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.FileName : string;
begin
  result := ExtractFileName( fFileName );
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.Name : string;
begin
  if Pos( FileExt, FileName ) > 0 then
    result := Copy( FileName, 0, pos( FileExt, FileName )-1 )
  else
    result := FileName;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.DosFileName : string;
begin
  result := StrPas( f.FindData.cAlternateFileName )
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.FileExt : string;
begin
  result := ExtractFileExt( fFileName );
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.isDirectory : boolean;
begin
  result := f.Attr AND faDirectory = faDirectory;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.isHidden : boolean;
begin
  result := f.Attr AND faHidden = faHidden;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.isSystemFile : boolean;
begin
  result := f.Attr AND faSysFile = faSysFile;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.isVolumeId : boolean;
begin
  result := f.Attr AND faVolumeId = faVolumeId;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.isArchive : boolean;
begin
  result := f.Attr AND faArchive = faArchive;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.FileSize : longint;
begin
  result := f.Size;
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.CreationTime : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftCreationTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.LastAccessed : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastAccessTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.LastWritten : TDateTime;
var
  LTime : TFileTime;
  Systemtime : TSystemtime;
begin
  FileTimeToLocalFileTime( f.FindData.ftLastWriteTime, LTime);
  FileTimeToSystemTime( LTime, SystemTime );
  result := SystemTimeToDateTime( SystemTime);
end;

{ ---------------------------------------------------------------------------- }
function TFileInfo.Execute : integer;
begin
  result := shellapi.ShellExecute( Application.Handle, 'open', pChar( fFileName ),
                                   '', pChar(Path),
                                   SW_SHOWDEFAULT );
  case result of
    0 :
     raise Exception.Create( 'Недостаточно памяти или ресурсов.' );
    ERROR_FILE_NOT_FOUND :
      raise Exception.Create( 'Указанный файл не найден.' );
    ERROR_PATH_NOT_FOUND :
      raise Exception.Create( 'Указанный путь не найден.' );
    ERROR_BAD_FORMAT :
      raise Exception.Create( 'Ошибка файла .EXE (не -Win32 .EXE или ошибка ' +
                              'в .EXE).' );
    SE_ERR_ACCESSDENIED :
      raise Exception.Create( 'Доступ к файлу запрещён.' );
    SE_ERR_ASSOCINCOMPLETE :
      raise Exception.Create( 'The filename association is incomplete or invalid.' );
    SE_ERR_DDEBUSY :
      raise Exception.Create( 'Транзакция DDE не может быть завершена, потому что ' +
                              'другая транзакция DDE находится в процессе выполнения.' );
    SE_ERR_DDEFAIL :
      raise Exception.Create( 'Ошибка транзакции DDE.' );
    SE_ERR_DDETIMEOUT :
      raise Exception.Create( 'DDE транзакция не может быть завершина из-за тайм-аута.' );
    SE_ERR_DLLNOTFOUND :
      raise Exception.Create( 'Указанная dynamic-link library не найдена.' );
    SE_ERR_NOASSOC :
      raise Exception.Create( 'Не найдено приложение связанной с данным расширением файла.' );
    SE_ERR_OOM :
      raise Exception.Create( 'Недостаточно памяти для завершения операции.' );
    SE_ERR_SHARE :
      raise Exception.Create( 'Файл используется другим приложением.' );
  else
  end;
end;

end.