Wie kann ich feststellen, ob eine Datei ein Nachkomme eines bestimmten Verzeichnisses ist?

Auf der Oberfläche ist das ziemlich einfach, und ich könnte es mir leicht umsetzen. Gerade nacheinander rufen dirname () auf, um jede Ebene in den Pfad der Datei zu gehen und jeden zu überprüfen, um zu sehen, ob es das Verzeichnis ist, für das wir suchen.

Aber Symlinks werfen das Ganze ins Chaos. Jedes Verzeichnis auf dem Pfad der Datei oder des Verzeichnisses, das überprüft wird, könnte ein Symlink sein, und jeder Symlink könnte eine beliebige Kette von Symlinks zu anderen Symlinks haben. An diesem Punkt schmilzt mein Gehirn und ich bin nicht sicher, was zu tun ist. Ich habe versucht, den Code zu schreiben, um diese speziellen Fälle zu behandeln, aber es wird bald zu kompliziert und ich nehme an, dass ich es falsch mache. Gibt es eine recht elegante Art, dies zu tun?

Ich benutze Python, also jede Erwähnung einer Bibliothek, die das tut, wäre cool. Ansonsten ist das ein ziemlich sprachneutrales Problem.

2 Solutions collect form web for “Wie kann ich feststellen, ob eine Datei ein Nachkomme eines bestimmten Verzeichnisses ist?”

Benutze os.path.realpath und os.path.commonprefix :

 os.path.commonprefix(['/the/dir/', os.path.realpath(filename)]) == "/the/dir/" 

os.path.realpath erweitert alle Symlinks sowie .. im Dateinamen. os.path.commonprefix ist ein bisschen unbeständig – es tut nicht wirklich auf Pfade, nur einfache String-Präfixe, so dass Sie sicherstellen sollten, dass Ihr Verzeichnis in einem Verzeichnis separator endet. Wenn du es nicht tust, wird es behaupten /the/dirtwo/filename ist auch in /the/dir

Python 3.5 hat die nützliche Funktion os.path.commonpath :

Gib den längsten gemeinsamen Teilpfad jedes Pfadnamens in den Sequenzpfaden zurück. Heben Sie ValueError an, wenn Pfade sowohl absolute als auch relative Pfadnamen enthält oder wenn Pfade leer sind. Im Gegensatz zu commonprefix() gibt dies einen gültigen Pfad zurück.

Also, um zu überprüfen, ob eine Datei ein Abkömmling eines Verzeichnisses ist, können Sie dies tun:

 os.path.commonpath(["/the/dir", os.path.realpath(filename)]) == "/the/dir" 

Im Gegensatz zu commonprefix müssen Sie sich keine Sorgen machen, wenn die Eingänge nachlaufende Schrägstriche haben oder nicht. Der Rückgabewert von commonprefix fehlt immer ein nachlaufender Schrägstrich.

  • Erstellen Sie eine baumartige Verzeichnisliste in Python
  • Sortierung der Datei mit Python auf Unix-System
  • Den absoluten Weg zu einer Datei aus der Pythonschlange herauszufinden
  • Wie kann man sicherstellen, dass eine Datei existiert oder erstellt werden kann, bevor sie in Python geschrieben wird?
  • Wann / Wie funktioniert ein anonymes Dateikörper?
  • Dateisystemunabhängige Art der Verwendung von glob.glob und regulären Ausdrücken mit Unicode-Dateinamen in Python
  • Führen Sie eine C # -Anwendung aus dem Python-Skript aus
  • Python: Hilfe mit Zähler und Schreiben von Dateien [duplizieren]
  • Wenn der Pfad symlink zu einem anderen Pfad ist
  • Wie kann ich das Dateisystem in python-Unit-Tests verspotten?
  • Python - Wie kann ich wissen, ob eine Datei beim Kopieren von einem externen Prozess abgeschlossen ist
  • Python ist die beste Programmiersprache der Welt.