Einzelnen Beitrag anzeigen

blackdrake

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

2 Verzeichnisse physikalisch identisch? NTFS-Hardlinks!

  Alt 22. Apr 2009, 22: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