Warum os.link() nicht auch für Windows???

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.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 6. Januar 2009, 17:42

jens hat geschrieben:Da wir schon mal bei den Rechten sind. Ich möchte auch was unter win32con.HKEY_CLASSES_ROOT eintragen. Dafür braucht man ebenfalls Admin Rechte.

Zumindest dafür habe ich eine Lösung. Statt unter HKEY_CLASSES_ROOT, trage ich nun meine Dinge unter HKEY_CURRENT_USER\Software\Classes ein ;) Da braucht man keine Admin rechte. Dafür sind die Einträge auch nur für den Aktuellen User gültig. Das Ein-/Austragen mache ich so:
http://code.google.com/p/simpledms/sour ... svn20&r=20

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 8. Januar 2009, 10:31

btw. eine Lösung für das erzeugen von Hard-/Symbolischen-Links suche ich immer noch :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 8. Januar 2009, 18:20

Was geht, sind Datei hardlinks, z.B.: win32file.CreateHardLink("test2.txt", "test.txt")

Bei einem win32file.CreateSymbolicLink("test", "test2") bekomme ich aber Fehler wie: Dem Client fehlt ein erforderliches Recht.

Ein kleines Test Programm hab ich hier gemacht: http://paste.pocoo.org/show/98615/


CreateSymbolicLink gibt's eh erst ab Vista. Denn erst bei NTFS von Vista gibt es Symbolische Links.
Als Alternative könnte man unter 2000 und XP halt die sog. "NTFS junction point" erzeugen. Hab in der win32api aber dazu nichts gefunden, habe aber diese .NET Funktion gesehen, weiß aber nicht wie ich da von CPython ran komme, siehe andern Thread: http://www.python-forum.de/topic-17343.html

EDIT: Eine Möglichkeit gibt es wohl doch: http://www.velocityreviews.com/forums/s ... ostcount=5
Stichwort win32file.DeviceIoControl, winioctlcon.FSCTL_SET_REPARSE_POINT und REPARSE_GUID_DATA_BUFFER
Sas ist echt abgefahren und sehr low-level, siehe: http://mail.python.org/pipermail/python ... 80295.html

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 8. Januar 2009, 22:05

Junction Points gehen aber nur für Verzeichnisse, oder?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 9. Januar 2009, 08:36

Ja, ich denke schon. Würde mir dennoch helfen.
Nun baue ich erstmal eine Variante mit subprocess :(

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 9. Januar 2009, 16:23

Mit http://code.google.com/p/simpledms/source/detail?r=21 hab ich nun eine funktionierende Variante.

Im Grunde steckt alles hier drin: http://code.google.com/p/simpledms/sour ... svn21&r=21

Ist noch alles mit der Heißennadel gestrickt.

Da es einfach mit win32file.CreateSymbolicLink nicht funktionieren will, benutzte ich nun per subprocess das sysinternal tool junction.exe.
Das dumme ist nur, das man es selber runterladen muß. Entweder packt man es dann in den Pfad oder ändert die Konstante os2.JUNCTION_EXE
In simpledms wird der pfad einmalig abgefragt und in die Config gespeichert.


Von der API her, kann man nach dem import von meinem "os2" Modul, das normale os.symlink und os.link auch unter Windows verweden. Sie Beispielcode ganz unten in os.py

Was haltet ihr vom "monkey patch" ?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

Beitragvon lunar » Freitag 9. Januar 2009, 16:37

jens hat geschrieben:Was haltet ihr vom "monkey patch" ?

Wenig, vor allem, wenn der Code noch instabil ist. Monkey-Patching verbirgt Abhängigkeiten und führt so dazu, dass Code schlechter zu durchschauen ist. Außerdem solltest du das wenn überhaupt mit einer Abfrage der Versionsnummer von Python verbinden, um zu verhindern, dass du Standardattribute überschreibst, wenn Python irgendwann mal Symlinks unter Windows unterstützt.

Ich würde eher eine zusätzliche Schicht einführen, die den Dateisystemzugriff noch weiter abstrahiert, und dort dann Symlink-Unterstützung für Windows implementieren, als direkt am os-Modul rumzupatchen.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]