Delphi - Bestandsinformatie opvragen
- Datum:
- Auteur: Stefan Cruysberghs
Er bestaat een heel interessante Shell API functie waarmee je het icoontje over een schijf, map of bestand kan ophalen (ShGetFileInfo). Als je deze functie in combinatie met de FindFirst functie van Delphi gebruikt, kan je een interessante functie creëeren die alle nodige informatie van een bestand ophaalt. Hieronder vind je de functie die ik hiervoor geïmplementeerd heb. De functie geeft een record-type terug waarin alle informatie terug te vinden is.
Voorbeeld
type
TFileInfo = record
Icon : hIcon;
Image : Integer;
DisplayName : String;
TypeName : String;
Size : Integer;
SizeDescription : String;
DateTime : TDateTime;
AttrArchive : Boolean;
AttrReadOnly : Boolean;
AttrSystem : Boolean;
AttrHidden : Boolean;
AttrVolume : Boolean;
AttrDirectory : Boolean;
end;
// ----------------------------------------------------------------
// Geef string met geformateerde bestandsgrootte terug (bytes, Kb, Mb or Gb)
// ----------------------------------------------------------------
function scGetSizeDescription(const IntSize : Int64) : String;
begin
if IntSize < 1024 then
Result := IntToStr(IntSize)+' bytes'
else
begin
if IntSize < (1024 * 1024) then
Result := FormatFloat('####0.##',IntSize / 1024)+' Kb'
else
if IntSize < (1024 * 1024 * 1024) then
Result := FormatFloat('####0.##',IntSize / 1024 / 1024)+' Mb'
else
Result := FormatFloat('####0.##',IntSize / 1024 / 1024 / 1024)+' Gb';
end;
end;
// ----------------------------------------------------------------
// Geef record met alle bestandsinformatie terug
// Hoe het icoon koppelen : ImageFile.Picture.Icon.Handle:=Info.Icon;
// ----------------------------------------------------------------
procedure scGetFileInfo(StrPath : String; var Info : TFileInfo);
var
SHFileInfo : TSHFileInfo;
SearchRec : TSearchRec;
begin
if Trim(StrPath) = '' then
Exit;
ShGetFileInfo(PChar(StrPath), 0, SHFileInfo, SizeOf (TSHFileInfo),
SHGFI_TYPENAME or SHGFI_DISPLAYNAME or SHGFI_SYSICONINDEX or SHGFI_ICON);
with Info do
begin
Icon := SHFileInfo.hIcon;
Image := SHFileInfo.iIcon;
DisplayName := SHFileInfo.szDisplayName;
TypeName := SHFileInfo.szTypeName;
end;
FindFirst(StrPath, 0, SearchRec);
with Info do
begin
try
DateTime := FileDateToDateTime(SearchRec.Time);
except
DateTime := Now();
end;
AttrReadOnly := ((SearchRec.Attr and faReadOnly) > 0);
AttrSystem := ((SearchRec.Attr and faSysFile) > 0);
AttrHidden := ((SearchRec.Attr and faHidden) > 0);
AttrArchive := ((SearchRec.Attr and faArchive) > 0);
AttrVolume := ((SearchRec.Attr and faVolumeID) > 0);
AttrDirectory := ((SearchRec.Attr and faDirectory) > 0);
Size := SearchRec.Size;
SizeDescription := scGetSizeDescription(Size);
end;
end;