Windows: Datei-Endung -> DateiTyp + Programm aus REG lese

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 22. November 2004, 22:48

Liest Informationen zu einer Datei-Endung aus der Registry aus. Dabei erhält man zum einen die Zuordnungen zur Endung und einmal das Verknüpfte Programm, sofern vorhanden :) s.Bsp-Ergebnis unten


Damit sind die Grundlagen gelegt für diese Frage:
http://python.sandtner.org/viewtopic.php?t=2287

Code: Alles auswählen

import _winreg

class FileTypeInfo:

    def __init__( self ):
        self.RegHandler = _winreg.ConnectRegistry(None,_winreg.HKEY_CLASSES_ROOT)

    def getInfo( self, FileExt ):
        FileType = self.readReg( FileExt )
        if FileType == None:
            return None

        FileTypeInfo = self.readReg( FileType )
        Programm = self.readReg( FileType+"\shell\open\command" )

        return [ FileTypeInfo, Programm ]

    ###
    ### Hilfs-Funktionen
    ###

    def readReg( self, KeyName ):
        try:
            KeyHandler = _winreg.OpenKey(self.RegHandler, KeyName)
            KeyInfo = _winreg.QueryValueEx(KeyHandler , "")[0]
        except WindowsError:
            return None

        _winreg.CloseKey(KeyHandler)
        return KeyInfo
Bsp.:

Code: Alles auswählen

MyFileTypeInfo = FileTypeInfo()

FileTypesInfo = {}

for Verz, VerzList, DateiListe in os.walk("C:\\"):
    for Datei in DateiListe:
        FileExt = os.path.splitext(Datei)[1]
        if not FileExt in FileTypesInfo:
            ExtInfo = MyFileTypeInfo.getInfo( FileExt )
            print FileExt,"->",ExtInfo
            FileTypesInfo[ FileExt ] = ExtInfo
Ergebnis (Bsp.):

Code: Alles auswählen

.SYS -> [u'Systemdatei', None]
.COM -> [u'Anwendung f\xfcr MS-DOS', u'"%1" %*']
.scf -> [u'Windows Explorer Command', u'explorer.exe']
.css -> [u'Kaskadierendes Stylesheet-Dokument', None]
.cfg -> [u'', u'"C:\\Programme\\wscite\\SciTE.exe" "%1"']
.xml -> [u'XML Document', u'"D:\\Programme\\Internet Explorer\\iexplore.exe" -nohome']
.sxw -> [u'OpenOffice.org 1.1.2 Text Dokument', u'"C:\\Programme\\OpenOffice.org\\program\\soffice.exe" -o "%1"']
Sorgenkind
User
Beiträge: 34
Registriert: Samstag 24. Juli 2004, 19:25
Kontaktdaten:

Dienstag 23. November 2004, 07:21

würde die resultate noch in einen Cache schreiben damits für längere dateilisten schneller geht
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 23. November 2004, 12:32

Es werden doch auch nur neue Endungen Abgefragt.
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dienstag 23. November 2004, 18:37

Hi. Sorgenkind meint, den cache bereits in der Klasse zu realisieren, das bringt ein wenig mehr Komfort. Aber schöner Code :D
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 24. November 2004, 08:41

Milan hat geschrieben:den cache bereits in der Klasse zu realisieren
Ok, bringt aber für meine Bedürfnisse wahscheinlich nicht's :)


Hier noch ein Update:

Code: Alles auswählen

import sys, os, _winreg

class FileTypeInfo:

    def __init__( self ):
        self.RegHandler = _winreg.ConnectRegistry(None,_winreg.HKEY_CLASSES_ROOT)

    def getInfo( self, FileExt ):
        """
        Bsp.
        FileExt = .chm
        FileType = chm.file
        FileTypeInfo = Kompilierte HTML-Hilfedatei
        Programm = '"C:\\WINDOWS\\hh.exe" %1'
        """
        FileType = self.readReg( FileExt )
        if FileType == None:
            return None

        FileTypeInfo = self.readReg( FileType )
        if FileTypeInfo == None:
            # Gibt wohl keine weiteren Info's, dann nehmen wir
            # lieber FileType, besser als nichts ;)
            FileTypeInfo = FileType

        Programm = self.readReg( FileType+"\shell\open\command" )
        if Programm != None:
            Test = Programm.replace("'",'"') # Vereinheitlichung
            for i in Test.split('"'):
                if os.path.isfile(i):
                    Programm = i.strip()

        return [ FileTypeInfo, Programm ]

    ###
    ### Hilfs-Funktionen
    ###

    def readReg( self, KeyName ):
        try:
            KeyHandler = _winreg.OpenKey(self.RegHandler, KeyName)
            KeyInfo = _winreg.QueryValueEx(KeyHandler , "")[0]
        except WindowsError:
            return None

        _winreg.CloseKey(KeyHandler)
        return KeyInfo.encode("latin-1")
Nun wird versucht, die Programme als Pfad zu extrahieren und nicht nur einfach der ganze REG-String zurück gegeben...

Hier mal eine paar Beispiele, wobei sowas wie das Ergebnis von ".chm" ehr dir Regel ist und alle anderen ehr die Ausnahme.
Bei ".hlp" wird nicht nur "%SystemRoot%\\System32\\winhlp32.exe" zurück gegeben, weil "%SystemRoot%" von os.path.isfile() nicht als "Systemvariable" ausgewertet wird...

Code: Alles auswählen

.chm
[u'Kompilierte HTML-Hilfedatei', u'C:\\WINXP\\hh.exe']

.hlp
[u'Hilfedatei', u'%SystemRoot%\\System32\\winhlp32.exe %1']

.exe
[u'Anwendung', u'"%1" %*']

.rat
[u'Rating System File', u'rundll32.exe msrating.dll,ClickedOnRAT %1']

.COM
[u'Anwendung f\xfcr MS-DOS', u'"%1" %*']

.DeskLink
[u'CLSID\\{9E56BE61-C50F-11CF-9A2C-00A0C90A90CE}', None]
EDIT: Hab bei readReg() am ende ein .encode("latin-1") hinzugefügt, damit Umlaute unterstützt werden...
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 3. Dezember 2004, 09:09

Hab nun gesehen, das bei wxPython ein "MimeTypesManager" dabei ist. Dazu gibt es eine gleichnamige Demo...
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Freitag 3. Dezember 2004, 16:27

jens hat geschrieben:EDIT: Hab bei readReg() am ende ein .encode("latin-1") hinzugefügt, damit Umlaute unterstützt werden...
Hi. Ich glaube, dass ist überflüssig, da die Strings eh in Unicode formatiert sind... da ist alles drin.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 3. Dezember 2004, 17:52

Ohne, bekomme ich aber ein UnicodeEncodeError!

Da fällt mir gerade ein... Vielleicht liegt es daran das die Ausgabe in SciTE's Ausgabefenster erscheint???
Antworten