This is my solution, this function's job is: If parameter AFilename is symbolic link, get it's target path, and "../" symbols remove and result set to link's target path. this function useful for unix based system, I tested just osx. Can it add in main source utils of lazarus ?

function GetTargetIfFileIsSymlink(const AFilename: string): string;
var FileAttr: LongInt;
    I, J : Integer;
begin
  Result := '';
  if not FileExistsUTF8(AFilename) then begin
    raise Exception.Create(Format(lrsFileDoesNotExist, [AFilename]));
  end;
  FileAttr := FileGetAttr(AFilename);
  if(FileAttr and faSymLink)=0then Result := ExtractFilePath(AFilename)
  else begin
   Result := fpReadLink(AFilename);
    with TStringList.Create do
    begin
      Delimiter := DirectorySeparator;
      DelimitedText := Result;
      J := 0;
      for I:=0 to Count -1 do
       if Strings[I]='..'then inc(J);

      if J>0then begin
        DelimitedText := ExtractFilePath(AFilename);
        while (J>0) and (Count>0) do begin
          Delete(Count-1);
          Dec(J);
        end;
      end;
      Result := DelimitedText;
      Free;
    end;
  end;
end;

On 17.02.2015 18:12, FreeMan wrote:

  {$IFDEF UNIX}
    S := ParamStrUTF8(0);
//CheckIfFileIsSymlink(S); I wish, this be a function and result be is fpReadLink, 'cos its in :)
    FileAttr := FileGetAttr(S);
    if(FileAttr and faSymLink)>0then S := fpReadLink(S)
    else s:= 'normal file';
  {$ENDIF}


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to