Seite 1 von 1

Win32FileFile

Verfasst: Montag 13. April 2009, 21:41
von kryz
hallo.

inspiriert durch das problem, unter windows ein file mit exklusivem zugriff zu öffnen, (http://www.python-forum.de/topic-18492.html), habe ich eine file-like klasse geschrieben, die auf der win32 extension win32file aufbaut. dadurch kann man die features der windows api nutzen (siehe http://tinyurl.com/6jqtza). ich habe versucht, möglichst das interface eines standard files nachzubauen. ein file mit exklusivem zugriff kann man folgendermassen öffnen

Code: Alles auswählen

f = Win32FileFile(filepath, 'w', dwShareMode=0)
die klasse
http://paste.pocoo.org/show/112400/
getestet habe ich das folgender massen
http://paste.pocoo.org/show/112401/

ich freue mich über jegliche konstruktive kritik

Verfasst: Montag 13. April 2009, 22:11
von lunar
In manchen Methoden bindest du Parameter unnötigerweise unverändert an lokale Namen, um diese dann an die WinAPI-Funktion zu übergeben. Sinnvoller wäre es, einfach gleich den entsprechenden Funktionen weiterzureichen.

".read()" finde ich wenig elegant, da die Größe der Datei explizit abgefragt wird. Zwar erzeugt das unter Windows dank der Mandatory Locks wohl keine Race Condition, langsamer und unelegant ist es imho trotzdem. Gibt es den über "win32file" keine Möglichkeit, einfach bis zu EOF zu lesen, wenn keine explizite Länge angegeben wurde?

Wo wir gerade dabei sind: Gibt es auch keine Möglichkeit, eine Zeile zu lesen? Das würde ".readline()" erheblich abkürzen, und es wäre auch performanter ...

".next()" ist eigentlich überflüssig, du könntest "__iter__()" auch als Generator implementieren:

Code: Alles auswählen

def __iter__(self):
    line = self.readline()
    while line:
        yield line
        line = self.readline()
Desweiteren könntest du in ".xreadlines()" eine DeprecationWarning auslösen, wenn die Python-Version neuer als 2.3 ist.

Der Name der Klasse ist zwar informativ, liest sich aber nicht sehr schön. "Win32File" oder "W32File" ist imho angenehmer ...

Edit: Ich möchte noch anmerken, dass ich selbst Linux nutze, und mich daher weder mit Windows noch mit dessen APIs sonderlich gut auskenne ;)