Datei-Attribute ermitteln
Der Typ TSearchRec enthält nach Verwendung von FindFirst einige Dateiinformationen, so auch die Dateiattribute. Da eine Datei nicht nur ein einziges Attribut enthalten kann, sondern auch eine Kombination (z.B. schreibgeschützt und Systemdatei), legen wir einen Mengentyp aller möglichen Attribute an:
type TFileAttributes = set of (ReadOnly, Hidden, SysFile, VolumeId, Directory, Archive, AnyFile);
Folgende Funktion liest nun die Attribute aus der angegebenen Datei aus und erstellt eine Ergebnismenge.
function GetFileAttributes(const FileName: string): TFileAttributes; var srec: TSearchRec; begin result:=[]; if FindFirst(FileName, faAnyFile, srec) = 0 then begin try if (srec.Attr and faReadOnly)>0 then result:=result+[ReadOnly]; //Schreibgesch. Datei if (srec.Attr and faHidden)>0 then result:=result+[Hidden]; //Verborgene Datei if (srec.Attr and faSysFile)>0 then result:=result+[SysFile]; //Systemdatei if (srec.Attr and faVolumeId)>0 then result:=result+[VolumeId]; //Laufwerks-ID if (srec.Attr and faDirectory)>0 then result:=result+[Directory]; //Verzeichnis if (srec.Attr and faArchive)>0 then result:=result+[Archive]; //Archivdatei if (srec.Attr and faAnyFile)>0 then result:=result+[AnyFile]; //Beliebige Datei finally FindClose(srec); end; end; end;
Aufrufbeispiel:
Durch den Aufruf der obigen Funktion bekommen wir eine Menge vom Typ TFileAttributes zurück. Mit dem Operator ‚in‘ können wir nun prüfen, welche Elemente sich in der Menge befinden. Im Folgenden wird geprüft, ob die Datei schreibgeschützt ist oder nicht. Beim Aufruf ist zu beachten, dass die Win32-API ebenfalls eine Funktion mit dem Namen GetFileAttributes beinhaltet. Die Namensbereiche dürfen sich also nicht in die Quere kommen. Im Zweifelsfall benennen Sie obige Funktion um.
procedure TForm1.Button1Click(Sender: TObject); var fa: TFileAttributes; begin fa:=GetFileAttributes('d:\temp\test.bmp'); if readonly in fa then ShowMessage('Datei ist schreibgeschützt') else ShowMessage('Datei ist NICHT schreibgeschützt'); end;