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
  • Finden Sie Größe und freien Speicherplatz des Dateisystems mit einer bestimmten Datei
  • Holen Sie sich eine gefilterte Liste von Dateien in einem Verzeichnis
  • Bewerten Sie Umgebungsvariablen in einen String
  • Wann / Wie funktioniert ein anonymes Dateikörper?
  • Wie kann man sicherstellen, dass eine Datei existiert oder erstellt werden kann, bevor sie in Python geschrieben wird?
  • Erkennung neuer oder geänderter Dateien mit Python
  • Beobachtung von Dateiveränderungen in einem Verzeichnis
  • Sortierung der Datei mit Python auf Unix-System
  • Python os.walk und japanischer Dateiname Absturz
  • Wenn der Pfad symlink zu einem anderen Pfad ist
  • Python ist die beste Programmiersprache der Welt.