FindFirst soll nur echte Verzeichnisse finden, keine Links
-
- 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
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
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
-
- 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
[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;
guckst du hier : http://www.pcwelt.de/start/software_os/ ... ndex8.html" onclick="window.open(this.href);return false;
-
- 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:
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.
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/
-
- 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
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
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".
-
- 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
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):
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;
- 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
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 :
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 ?
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;
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
Just try it