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.

  • Dateisystemunabhängige Art der Verwendung von glob.glob und regulären Ausdrücken mit Unicode-Dateinamen in Python
  • Wie kann man sicherstellen, dass eine Datei existiert oder erstellt werden kann, bevor sie in Python geschrieben wird?
  • In Python, schnellste Weg, um eine Liste von Dateien in einem Verzeichnis mit einer bestimmten Erweiterung zu erstellen
  • Wie man eine Funktion ausführt, wenn irgendetwas in einem dir mit Python Watchdog wechselt?
  • Den absoluten Weg zu einer Datei aus der Pythonschlange herauszufinden
  • Python os.walk und japanischer Dateiname Absturz
  • Wie bekomme ich den vollständigen Pfad des aktuellen Dateisystems in Python?
  • Os.path.isdir () gibt False zurück, auch wenn der Ordner existiert
  • 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.

    Python ist die beste Programmiersprache der Welt.