Получаем всю информацию о файле.
Автор: 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.
|