Seite 1 von 2

Verfasst: Dienstag 6. Januar 2009, 17:42
von jens
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

Verfasst: Donnerstag 8. Januar 2009, 10:31
von jens
btw. eine Lösung für das erzeugen von Hard-/Symbolischen-Links suche ich immer noch :(

Verfasst: Donnerstag 8. Januar 2009, 18:20
von jens
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

Verfasst: Donnerstag 8. Januar 2009, 22:05
von Leonidas
Junction Points gehen aber nur für Verzeichnisse, oder?

Verfasst: Freitag 9. Januar 2009, 08:36
von jens
Ja, ich denke schon. Würde mir dennoch helfen.
Nun baue ich erstmal eine Variante mit subprocess :(

Verfasst: Freitag 9. Januar 2009, 16:23
von jens
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" ?

Verfasst: Freitag 9. Januar 2009, 16:37
von lunar
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.