Seite 1 von 1

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

Verfasst: Mittwoch 4. Juli 2007, 10:31
von droptix
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?

Verfasst: Mittwoch 4. Juli 2007, 11:14
von BlackJack
Ein "hardlink" ist alles was kein "symlink" ist. Brauchst also nur das Ergebnis von `islink()` negieren. :-)

Verfasst: Mittwoch 4. Juli 2007, 11:21
von droptix
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.

Verfasst: Mittwoch 4. Juli 2007, 11:54
von Rebecca
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.

Verfasst: Mittwoch 4. Juli 2007, 12:04
von droptix
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.

Verfasst: Mittwoch 4. Juli 2007, 12:23
von 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.

Verfasst: Mittwoch 4. Juli 2007, 12:29
von Rebecca

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

Verfasst: Mittwoch 4. Juli 2007, 13:47
von birkenfeld
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.

und was ist mit Junction Points

Verfasst: Mittwoch 7. November 2007, 13:59
von droptix
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