{%MainUnit fileutil.pas} {------------------------------------------------------------------------------ function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; ------------------------------------------------------------------------------} function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; var LinkFilename: string; AText: string; Depth: Integer; begin Result:=Filename; Depth:=0; while Depth<12 do begin inc(Depth); LinkFilename:=FpReadLink(Result); if LinkFilename='' then begin AText:='"'+Filename+'"'; case fpGetErrno() of ESysEAcces: AText:='read access denied for '+AText; ESysENoEnt: AText:='a directory component in '+AText +' does not exist or is a dangling symlink'; ESysENotDir: AText:='a directory component in '+AText+' is not a directory'; ESysENoMem: AText:='insufficient memory'; ESysELoop: AText:=AText+' has a circular symbolic link'; else // not a symbolic link, just a regular file exit; end; if (not ExceptionOnError) then begin Result:=''; exit; end; raise EFOpenError.Create(AText); end else begin if not FilenameIsAbsolute(LinkFilename) then Result:=ExpandFileNameUTF8(ExtractFilePath(Result)+LinkFilename) else Result:=LinkFilename; end; end; // probably an endless loop if ExceptionOnError then raise EFOpenError.Create('too many links, maybe an endless loop.') else Result:=''; end; function ExtractShortPathNameUTF8(const FileName: String): String; begin Result:=SysToUTF8(SysUtils.ExtractShortPathName(UTF8ToSys(FileName))); end;