Findfirst / findnext & hardlinks unter linux

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Reinhard
Beiträge: 46
Registriert: Fr 26. Sep 2008, 16:56

Findfirst / findnext & hardlinks unter linux

Beitrag von Reinhard »

Folgendes Problem :

In einem Verzeichnis (z.b./home/user/test) befindet sich ein sog.Hardlink zu einem weiteren Verzeichnis z.b. "dIR1"

Das Problem an der Sache ist nun wenn ich alle Dateien eines Verz. einlesen will finde ich mittels (findfirst bzw findnext) zwar alle Verz unhd Dateien in diesem Verz. jedoch die "Hardlinks" scheinen nicht auf.

Evt.muss man einen anderen Wert für "attribut" angeben, nur ist mir keiner bekannt, "symlink" kommt ja nicht in Frage da es sich ja ein hardlink und keinen softlinklink handelt. (Funktioniert aber auch nicht - habe ich schon Versucht).


Interessant ist die Tatsache, das keines von den Lazarus IDE eigenen Objekten (TFilelistbox) (TShellListView) diesen "hardlink" finden.

Es scheint also irgendetwas mit dem findfirst/findnext unter linux nicht zu stimmen das diese "hardlinks" nicht gefunden werden.


FPC Version ist 2.6

Mittels "ls-la" ist der hardlink sichtbar :

Code: Alles auswählen

 
usert@user-12:/home/user$ ls-la test
insgesamt 8
rwxrwxrwx 3  libuuid   500 16 Apr  6 13:35 .
drwxrwxrwx 4 libuuid   500  24 Apr  6 13:30 ..
drwxrwxr-x 2  libuuid   500  1 Apr  6 16:28 MyTestDir
lrwxrwxrwx 1 libuuid   500 55 Apr  6 13:32 (TestLink)-MyTestDir -> MyTestDir
 
 
Mein Code sieht so aus :

Code: Alles auswählen

 
Procedure GetFiles(aDirectory:String;aStringlist:TStrings);
VAR
   SearchRec:TSearchRec;
 
   Begin
     aStringlist.Clear;
     If sysutils.FindFirst (  MyIncludeTrailingPathDelimeter (UTF8ToSys(aDirectory) ) + '*', faAnyFile and not fahidden, SearchRec) = 0 Then
      Begin
           REPEAT
           Application.ProcessMessages;
           If (SearchRec.Attr and faDirectory <> faDirectory) and (SearchRec.Name <> '.') and (SearchRec.Name <> '..') Then {Only allow files}
          Begin
                {Entry is a File}
                aStringlist.Add(SearchRec.Name);
            End;
      Until Sysutils.FindNext (SearchRec) <> 0;
      Sysutils.FindClose (SearchRec);
    End;
  End;                       
 

Reinhard
Beiträge: 46
Registriert: Fr 26. Sep 2008, 16:56

Re: Findfirst / findnext & hardlinks unter linux

Beitrag von Reinhard »

So habe es jetzt (denke ich) soweit das es funktioniert.

Es sind keine Hardlinks, sondern "Symlinks".

So wie es aussieht muss man bei Findfirst ein "faSymlink" dazufügen, sonnst werden die "Symlinks" ignoriert und erst gar nicht von findfirst/findnext gefunden.


Folgende Procedure müsste das Problem nun erledigen :

Code: Alles auswählen

 
procedure deltree(const DirName:String);
    var
       tfileinfo: TSearchRec;
       retcode: longint;
       RemoveName:String;
 
 
       begin
      RemoveName:=IncludeTrailingPathDelimeter(DirName)+'*';
 
      retcode := Sysutils.FindFirst(RemoveName, faanyfile or fasymlink, tfileinfo);
      while retcode = 0 do
        begin
             Application.ProcessMessages;
             if (tfileinfo.attr and faDirectory = faDirectory)  then
            begin
              if (tfileinfo.name <> '.') and (tfileinfo.name <> '..') Then
                Begin
                     If (TFileInfo.Attr and faSymlink = faSymLink) Then DeleteFile(DirName + '/' + tfileinfo.name) else
                     deltree(DirName + '/' + tfileinfo.name)
 
                end;
            end
          else
            begin
              if DeleteFile(DirName + '/' + tfileinfo.name) = false then
                Begin
                    ShowMessage('Delete file failed');
                End;
            end;
          retcode := Sysutils.FindNext(tfileinfo);
        end;
      FindClose(tfileinfo);
      if RemoveDir(DirName) = false then
        Begin
                          ShowMessage('Removing Folder Failed'+LineEnding+DIrName);
        End;
    end;          
 
 

Antworten