os.path.islink(), HardLinks, Junction Points

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Python kann HardLinks unter Unix und Mac setzen:
Dokumentation hat geschrieben:link( src, dst)

Create a hard link pointing to src named dst. Availability: Macintosh, Unix.
Python kann unter Unix auch SymLinks setzen (Wieso nicht auch unter Mac?):
Dokumentation hat geschrieben:symlink( src, dst)

Create a symbolic link pointing to src named dst. Availability: Unix.
Python kann SymLinks erkennen:
Dokumentation hat geschrieben:islink( path)

Return True if path refers to a directory entry that is a symbolic link. Always False if symbolic links are not supported.
Aber ich finde nichts, womit Python auch HardLinks erkennen kann.

Eigentlich sollte os.path.islink besser os.path.issymlink heißen. Dann könnte die Funktion os.path.islink dafür gedacht sein, um HardLinks zu erkennen.

--

Was ist eigentlich mit Windows? Ein Junction Point ist doch auch eine Art SymLink. Und Windows unterstützt auch HardLinks ab NTFS 5. Gibt es dafür eine Unterstützung, z.B. in den Win32 Extensions?
BlackJack

Ein "hardlink" ist alles was kein "symlink" ist. Brauchst also nur das Ergebnis von `islink()` negieren. :-)
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

BlackJack hat geschrieben:Brauchst also nur das Ergebnis von `islink()` negieren.
Dann wären ja Dateien und Verzeichnisse auch HardLinks. Das ist ja so nicht ganz korrekt. HardLinks sind ja auch nur Verweise (also wie Referenzen), aber eben auf einen Inode und nicht auf einen Pfad.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Doch, genau das.

Wenn du ls -l eingibst, werden in der zweiten Spalte die Anzahl Hardlinks gezeigt, die auf diese Datei verweisen. Du siehst bei Dateien normalerweise dort eine 1 (der Zaehler fuer "die eigentliche Datei"), fuer Verzeichnisse mindestens zwei (fuer "das Verzeichnis selbst" und das Unterverzeichnis .., welches auch ein Hardlink ist). Fuer jeden erzeugten Hardlink wird dieser Zaehler hochgezaehlt, fuer jedes rm auf einen solchen Hardlink oder "die eigentliche Datei" wird der Zaehler runtergezaehlt. Ist der Zaehler auf Null, wird die Datei komplett entfernt. (Wenn man sichs genau ueberlegt, funktioniert das wie mit Pythons Referenzen und dem Garbage Collector :))

Du hast keine Chance, zu erkennen, welches "die eigentliche Datei" ist und welches ein Hardlink, das hat mit Python nichts zu tun. Das einzige, was du rausfinden kannst, ist, wie oft die Datei im Dateisystem verlinkt wurde.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Na weiß denn wenigstens das Dateisystem welches die Originaldatei ist :D Komische Sache...

Bleibt noch die Frage mit Windows und den dortigen Junction Points und den Windows Hardlinks.
BlackJack

Du meinst welches der originale, das heisst erste Link ist. Nein das kann man nachträglich nicht herausfinden. Es gibt nur eine Datei.

Das ist wie mit Namen und Objekten in Python. Ein Objekt kann viele Namen haben, und keiner davon ist irgendwie "priviligierter" oder anders als die anderen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

droptix hat geschrieben: Python kann unter Unix auch SymLinks setzen (Wieso nicht auch unter Mac?):
Die heutigen Macs fallen alle unter die Kategorie Unix. "Macintosh" steht für MacOS <= 9.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich bin mal wieder an dem Punkt, wo ich unter Windows Junction Points erkennen möchte. Hat jemand eine Ahnung, wie man das mit Python realisieren könnte? Microsoft bietet hier ja einige WMI-Scripts... die man mit den Win32 Extensions for Python benutzen kann.

Leider sind da immer nur Code-Snippets zu finden und keine ausführliche Dokumentation. Daher komme ich nicht richtig weiter. Bin für jeden Tipp dankbar :D
Antworten