FindFirst soll nur echte Verzeichnisse finden, keine Links

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Wie bekommt man aber unter windows heraus, ob es sich bei einem Verzeichnis um einen Link handelt oder nicht ?
fpLStat funktioniert hier ja schliesslich nicht.
Zu faSymLink gibt es auch schon einen Eintrag im Bugtracker aber leider noch keinen Patch.
Die Frage ist ja auch, ob sich mit faSymLink (wenn es funktioniert) unter windows auch SymLinks und Junctions unterscheiden lassen.
Ich bin nämlich gerade dabei die Größe von Verzeichnissen in einem Prog zu ermitteln und bin dabei genau über diese Problematik gestolpert.
Schließlich will ich dabei zwar die Symlinks anzeigen aber ihnen nicht folgen.
Im übrigen läßt sich FindFirst auch mit dem Attr faSymLink ausführen, dann werden die SymLinks aber komplett ignoriert, was mir auch wieder nicht hilft da ich die Links zumindest mit Größe 0 anzeigen will.
Ein Teufelskreis ...
Gruß
Daniel

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Kannst du unter Windows nicht auf die Datei Endung achten ? wenn es eine lnk(waren das nicht die Link Dateien ?) Datei ist, handelt es sich um ein Link den du nicht beachten muss.
MFG
Michael Springwald

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Ich meinte hier nich die *.lnk Dateien sondern echte Links, die gibt es seit Win2k als junctions um z.B. eine Festplatte oder CDROM auf ein Verzeichnis zu linken und seit Vista gibt es auch richtige SymLinks.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Nicht seit Vista, ntfs kann das schon immer. Aber du wirst wohl auf den patch für faSymlink warten müssen oder selbst einen beisteuern.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

[klugscheiss an]SymLinks sind bei Vista neu hinzugekommen[klugscheiss aus]
guckst du hier : http://www.pcwelt.de/start/software_os/ ... ndex8.html" onclick="window.open(this.href);return false;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Frei nach der Wikipedia:

Auch Windows unterstützt auf NTFS-Partitionen mehrere Hard Links pro Datei. Mit Windows-NTFS-Partitionen können Hard Links mit dem fsutil hardlink utility (Windows XP), dem mklink Befehl (Windows Vista) oder mit Programmen von Drittherstellern (bspw. FAR commander oder ntfslink) erstellt werden.

Was ist ein NTFS-Abzweigungspunkt?
Ein Abzweigunspunkt ist eine Funktion des NTFS-Dateisystems mit dem ihr einen Link auf einen Ordner anlegen könnt. Im Grunde wird dabei ein leerer Ordner erstellt der auf den Orginalordner verweist. Wenn ihr nun ein Programm aus dem "Abzweigungsordner" startet werden alle Schreib- u. Lesevorgänge durch den Dateisystemtreiber an den Orginalordner weitergeleitet.

Was ist ein Hardlink?
Ein Hardlink stellt im Grunde die gleiche Funktion für Dateien bereit, wie dies Abzweigungspunkte für Ordner tun. Der Unterschied zu einem Softlink (Verknüpfung die an der Endung *.lnk zu erkennen ist) besteht darin, dass Programme den Unterschied zwichen der Verknüpfung und dem Orginal nicht erkennen.

Nach http://www.mcseboard.de" onclick="window.open(this.href);return false;:

Wie erstelle ich Abzweigungspunkte oder Hardlinks?
Leider bieten Windows 2000 und XP keine integrierten Funktionen für die Verwaltung von Abzweigungspunkten und Hardlinks. Es bieten sich jedoch zwei Programme an, die dafür geeignet sind:

Linkd.exe aus den Windows Server 2003 Resource Kit Tools (Bietet zwar die gewollten Funktionen - gestaltet sich aber in der Praxis als zu umständlich)
Download: http://www.microsoft.com/downloads/d...displaylang=en" onclick="window.open(this.href);return false;

NTFS Link 2.1: Ist eine komfortables Tool, dass das Kontextmenü des Explorers erweitert um Hardlinks und Abzweigunspunkte zu erstellen und zu verwalten.
Download: http://www.wintotal.de/softw/index.php?id=2400" onclick="window.open(this.href);return false;
Hersteller: http://www.elsdoerfer.info/ntfslink/" onclick="window.open(this.href);return false;


Das kann ntfs schon immer, vista wäre auch inkompatibel zum bisherigen ntfs wenn sie dort irgendwelche s gravierenden änderungen eingeführt hätten. Dort gibts lediglich ein besseres interface dazu. Gehn tut das schon seit NT 3.51.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

danny61
Beiträge: 94
Registriert: So 5. Nov 2006, 18:40
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Berlin

Beitrag von danny61 »

Zusätzlich zu den Hardlinks und Abzweigpunkten (junctions) sind jetzt noch SymLinks hinzu gekommen.
Hardlink anlegen :
mklink /h
junction anlegen:
mklink /j
SymLink anlegen:
mklink oder
mklink /d
Die Symlinks vereinigen einige Vorteile der Junctions (für Ordner) und Hardlinks (für Dateien), ohne deren Beschränkungen. Einzige Voraussetzung ist, dass der symbolische Link auf einem NTFS-Datenträger liegt, das Original kann sich auf NTFS, FAT(32) oder im Netzwerk befinden. Symlinks repräsentieren sowohl Dateien als auch Ordner, zeigen Dateityp und Icon wie das Original, erhalten aber einen Verknüpfungspfeil und als Größenanzeige „0 KB".

Giantics
Beiträge: 88
Registriert: Sa 3. Mär 2007, 13:46
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Langenbrettach

Re: FindFirst soll nur echte Verzeichnisse finden, keine Links

Beitrag von Giantics »

Ich muss diesen Thread leider nochmal ausgraben.
Es hat sich herausgestellt, dass meine oben genannte IsRealDirectory-Funktion zum Ausschluss von SymLinks bei NTFS-Partitionen nicht funktioniert.

Folgende Funktion sollte jedoch funktionieren (getestet auf ext3 und NTFS):

Code: Alles auswählen

function IsRealDirectory(const strPath, strFile: string):Boolean;
  var
    info: stat;
  begin
    fplstat(strPath + strFile, @info);
    Result := not ((strFile='.') or (strFile='..') or fpS_ISLNK(info.st_mode));
  end;

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1641
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: FindFirst soll nur echte Verzeichnisse finden, keine Links

Beitrag von corpsman »

Guten Morgen allerseits,

Als Braver Suchmaschinen nutzer bevor Poster habe ich diesen Thread hier gefunden, und er beschreibt genau mein Problem.

Unter Linux läuft mein Suchendialog in eine Endlosschleife, da er einen dieser merkwürdigen Links Endlos weiter verfolgt. Hier mein Code :

Code: Alles auswählen

 
Procedure SearchForFiles(ADirectory: String; AMask: String; ARekursiv: Boolean);
Var
  SR: TSearchRec;
Begin
  If stop Then exit;
  If (ADirectory <> '') And (ADirectory[length(ADirectory)] <> PathDelim) Then
    ADirectory := ADirectory + PathDelim;
  If (FindFirstUTF8(ADirectory + '*', faAnyFile - faDirectory, SR) = 0) Then Begin
    Repeat
      If Match(AMask, sr.name) Then Begin
        If (SR.Name <> '.') And (SR.Name <> '..') And (SR.Attr <> faDirectory) Then
          form1.AddFinding(SR.Name, ADirectory, SR.size);
      End;
      Application.ProcessMessages;
    Until (FindNextUTF8(SR) <> 0) Or stop;
    FindCloseUTF8(SR);
  End;
  // Suche in Unterverzeichnissen
  If ARekursiv Then
    If (FindFirstUTF8(ADirectory + '*', faDirectory Or faHidden, SR) = 0) Then Begin
      Repeat
        If (SR.Name <> '.') And (SR.Name <> '..') Then
          If DirectoryExistsUTF8(ADirectory + SR.Name) Then
            SearchForFiles(ADirectory + SR.Name, AMask, ARekursiv);
        Application.ProcessMessages;
      Until (FindNextUTF8(SR) <> 0) Or stop;
      FindCloseUTF8(SR);
    End;
End;
Mein Problem ist nun dass ich nicht ganz verstehe wie ich die version giantics einbinden soll, da sie ja 2 Parameter hat.
Zudem compiliert es schon gar nicht weil mein Kompiler nicht weis was das stat sein soll, welche Units müssen hierzu noch eingebunden werden ?

[Edit]

Also ich habs unter Linux zum laufen gebracht in der Unit "BaseUnix" ist die Stat definiert. Diese Variante geht sicher nicht unter Windows, welche Unit muss ich da einbinden ?
--
Just try it

Antworten