Das deutsche Python-Forum

Diskussionen rund um die Programmiersprache Python
Aktuelle Zeit: Fr Sep 03, 2010 02:07

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Windows: Datei-Endung -> DateiTyp + Programm aus REG lese
BeitragVerfasst: Mo Nov 22, 2004 23:48 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
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:
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:
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:

.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"']
 


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 23, 2004 08:21 
User

Registriert: Sa Jul 24, 2004 20:25
Beiträge: 34
würde die resultate noch in einen Cache schreiben damits für längere dateilisten schneller geht


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 23, 2004 13:32 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
Es werden doch auch nur neue Endungen Abgefragt.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 23, 2004 19:37 
User

Registriert: Mi Okt 16, 2002 21:52
Beiträge: 1066
Hi. Sorgenkind meint, den cache bereits in der Klasse zu realisieren, das bringt ein wenig mehr Komfort. Aber schöner Code :D


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 24, 2004 09:41 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
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:
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:
.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...


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 10:09 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
Hab nun gesehen, das bei wxPython ein "MimeTypesManager" dabei ist. Dazu gibt es eine gleichnamige Demo...


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 17:27 
User

Registriert: Mi Okt 16, 2002 21:52
Beiträge: 1066
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.


Nach oben
 Profil  
 
 Betreff des Beitrags:
BeitragVerfasst: Fr Dez 03, 2004 18:52 
Moderator

Registriert: Di Aug 10, 2004 10:40
Beiträge: 6153
Wohnort: duisburg
Ohne, bekomme ich aber ein UnicodeEncodeError!

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


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de