On Tue, 24 Sep 2019, Anthony Walter wrote:

Related,

It would seem on Linux that FindFirst, FindNext or TSearchRec that none of
them can properly detect a symbolic link. For example, if you wanted
enumerate files and folder, and there exists a symbolic link inside one
folder to some parent of said folder, it's not possible to detect leading
to endless recursion. faSymLink currently isn't picked up. I have to use
code like this:

uses
 BaseUnix;

function IsSymLink(const Path: string): Boolean;
var
 Stat: TStat;
begin
 fpLstat(PChar(Path), Stat);
 Result := fpS_ISLNK(Stat.st_mode);
end;

Which slows down the search a bit.

It works here. Did you specify faDirectory together with faSymlink ?

If you don't, directories will not get picked up since the directory
attribute is included in the resulting info (as windows does this too).

I.e. this won't work:

uses sysutils;

var
  info : TSearchrec;

begin
  if findfirst('*',faSymlink,Info)=0 then
    try
    repeat
      if (info.attr and faSymlink)<>0 then
        Writeln('symlink :',info.name)
    until findnext(info)<>0;
    finally
      findclose(info);
end; end.

It will only pick up symlinked files.

But

uses sysutils;

var
  info : TSearchrec;

begin
  if findfirst('*',faSymlink or faDirectory,Info)=0 then
    try
    repeat
      if (info.attr and faSymlink)<>0 then
        Writeln('symlink :',info.name)
    until findnext(info)<>0;
    finally
      findclose(info);
    end;
end.

will report directories.

Tested in trunk and 3.0.4

Michael.
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to