AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi 2 Verzeichnisse physikalisch identisch? NTFS-Hardlinks!
Thema durchsuchen
Ansicht
Themen-Optionen

2 Verzeichnisse physikalisch identisch? NTFS-Hardlinks!

Offene Frage von "blackdrake"
Ein Thema von blackdrake · begonnen am 22. Apr 2009 · letzter Beitrag vom 27. Apr 2009
 
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

2 Verzeichnisse physikalisch identisch? NTFS-Hardlinks!

  Alt 22. Apr 2009, 21:16
Hallo.

Ich möchte gerne herausfinden, ob zwei Verzeichnisse physikalisch identisch sind.

Bis jetzt habe ich folgenden Code:

Delphi-Quellcode:
{$DEFINE CHECK_UNC}

function ExpandFilePath(AFileName: string): string;
begin
  {$IFDEF CHECK_UNC}
  result := ExpandUNCFileName(AFileName);
  {$ELSE}
  result := ExpandFileName(AFileName);
  {$ENDIF}
end;

function AreFilesOrDirectoriesIdentical(A, B: string): boolean;
begin
  A := ExpandFilePath(A);
  B := ExpandFilePath(B);

  // Damit C:\Windows und C:\Windows\ als gleich gekennzeichnet
  // werden, fügen wir beiden einen Backslash hinzu - auch wenn es sich
  // um Dateien handelt.
  // Grund: Sowohl für ExpandUNCFileName() als auch für SameFileName()
  // ist es nicht von Bedeutung, ob die Datei / das Verzeichnis existiert
  // oder nicht.
  // Außerdem teilen sich Dateien und Ordner in allen Betriebssystemen
  // den selben Namensraum.

  A := IncludeTrailingPathDelimiter(A);
  B := IncludeTrailingPathDelimiter(B);

  result := SameFileName(A, B);
end;
Ich kann in diese Funktion Dateien und Ordner reinschrieben und es gibt kein Problem, wenn Pfadangaben durch .. oder . Angaben abgeändert wurden.

Bei NTFS-Dateisystemen gibt es aber jetzt folgende Probleme:

1. Gleiche Verzeichnisse durch NTFS-HardLinks

Die Verzeichnisse
C:\Ordner\Symlink\
und
C:\AndererOrdner\
könnten gleich sein, wenn C:\AndererOrdner\ ein Hardlink von C:\Ordner\Symlink\ ist.

Ebenfalls könnten aber auch
C:\Ordner\Symlink\X\
und
C:\AndererOrdner\X\
gleich sein, obwohl C:\AndererOrdner\X\ kein Hardlink von C:\Ordner\Symlink\X\ ist (denn der Hardlink ist eine Stufe tiefer).

Ich befürchte, dass man eventuell beliebig komplizierte Szenarios hinbekommen kann, bei denen ein eventueller Algorithmus, der den Verzeichnisbaum abläuft, fehlschlagen könnte. Ich bin mir da aber nicht ganz sicher.

1b. Gleiche Verzeichnisse durch Linux-Symlinks

Ich möchte nach Möglichkeit portablen Code schreiben. Deswegen soll Problem #1 auch für Linux' SymLinks funktionieren (durch Compiler-Flag-Variante).
(Leider habe ich derzeit hierfür überhaupt keine Testmöglichkeit.)

2. Gleiche Verzeichnisse durch NTFS-MountPoints

Sei z.B. eine externe Festplatte sowohl auf X:\ als auch in C:\ExterneHDD\ gemounted (letzteres mittels NTFS-MountPoints).

Dann sind X:\ und C:\ExterneHDD\ physikalisch identisch, obwohl (möglichweise) kein echter HardLink vorliegt.

...

Ob es andere Szenarios gibt, bei denen man physikalisch identische Verzeichnisse hinbekommt, bin ich mir nicht ganz sicher.

Könnt ihr mir bitte Tipps oder Codebeispiele geben, wie ich eine Funktion hinbekommen kann, die auch bei NTFS-Hardlinks/Symlinks/NTFS-MountPoints (zuverlässig) funktioniert?

Triviale Lösung: Ich könnte zwar in das Verzeichnis einfach eine Zufallsdatei erstellen und schauen, ob diese im anderen Verzeichnis plötzlich auch erschienen ist ... aber ich erachte das als schlechten Programmierstil, da ich die Datenverzeichnisse der Endanwender nicht mit Temp-Dateien zumüllen möchte.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz