atomicid 10 Geschrieben 8. Juni 2005 Melden Teilen Geschrieben 8. Juni 2005 hallo, ich möchte in aus einer script sprache heraus (python) die dateiinformationen von Dateien auslesen (Title, Thema, Kategorie, Stichwörter, Kommentare). diese infos sind in NTFS alternativen datenströmen (ads) gespeichert. daher nur auf ntfs laufwerken verfügbar. bei heysoft kann man sich ein tool downloaden, welches die ads streams anzeigt. dieses liefert z.b. folgendes ergebnis: --- LADS - Freeware version 4.00 © Copyright 1998-2004 Frank Heyne Software (http://www.heysoft.de) This program lists files with alternate data streams (ADS) Use LADS on your own risk! Scanning directory c:\daten\ size ADS in file ---------- --------------------------------- 120 c:\daten\test.txt:♣DocumentSummaryInformation 252 c:\daten\test.txt:♣SummaryInformation 0 c:\daten\test.txt:{4c8cc155-6c1e-11d1-8e41-00c04fb9386d} --- Im ads SummaryInformation befindet sich beispielsweise folgender inhalt: --- þÿ à…ŸòùOh«‘ +'³Ù0 Ì 8 €@ H \ p € ä test.txt information test A beschreibung asdlfsdf lk asjf asdfjö sdaflj --- erreicht wird dies durch einen einfachen aufruf fopen(test.txt:♣SummaryInformation) wobei ♣ mit \005 codiert wird. die von mir benötigten infos stehen also in diesem ads allerdings hintereinander in einem nicht spezifiziertem(?) format. Python bietet keine möglichkeit diese infos auszulesen (API) ich suche jetzt eine möglichkeit mittels eines consolen basierten tools diese infos auszuleesen. z.b. tool test.txt GetAuthor besser würde mir der betriebssystem aufruf gefallen, welcher im hintergrund aufgerufen wird, wenn man im eigenschaften menü die eigenschaften einträgt. bin mit dem tool filemon von sysinternals auf die system dll docprop und docprop2 aufmerksam geworden. anscheinend erledigt diese das lesen und schreiben der dateiinformationen. habe anschließend versucht mit rundll an die infos ranzukommen. die verfügbaren exported functions für den rundll aufruf währen: docprop.dll: - DllCanUnloadNow - DllGetClassObject docprop2.dll - DllCanUnloadNow - DllGetClassObject - DllRegisterServer - DllUnregisterServer kann sein, das ich mit diesem docprop auf dem holzweg bin. hat jemand eine idee/tool wie man die infos unter angabe des infonamens (thema, author, etc.) auslesen kann? mfg uwe Zitieren Link zu diesem Kommentar
flexxxen 10 Geschrieben 8. Juni 2005 Melden Teilen Geschrieben 8. Juni 2005 Hallo, hier ist ein komplettes python Programm, welches die Dateiinfos aus mp3-files ausliest, um die Tags zu ermitteln....evtl kannst Du das ja für Deine belange umbiegen: """Framework for getting filetype-specific metadata. Instantiate appropriate class with filename. Returned object acts like a dictionary, with key-value pairs for each piece of metadata. import fileinfo info = fileinfo.MP3FileInfo("/music/ap/mahadeva.mp3") print "\\n".join(["%s=%s" % (k, v) for k, v in info.items()]) Or use listDirectory function to get info on all files in a directory. for info in fileinfo.listDirectory("/music/ap/", [".mp3"]): ... Framework can be extended by adding classes for particular file types, e.g. HTMLFileInfo, MPGFileInfo, DOCFileInfo. Each class is completely responsible for parsing its files appropriately; see MP3FileInfo for example. """ import os import sys from UserDict import UserDict def stripnulls(data): "strip whitespace and nulls" return data.replace("\00", "").strip() class FileInfo(UserDict): "store file metadata" def __init__(self, filename=None): UserDict.__init__(self) self["name"] = filename class MP3FileInfo(FileInfo): "store ID3v1.0 MP3 tags" tagDataMap = {"title" : ( 3, 33, stripnulls), "artist" : ( 33, 63, stripnulls), "album" : ( 63, 93, stripnulls), "year" : ( 93, 97, stripnulls), "comment" : ( 97, 126, stripnulls), "genre" : (127, 128, ord)} def __parse(self, filename): "parse ID3v1.0 tags from MP3 file" self.clear() try: fsock = open(filename, "rb", 0) try: fsock.seek(-128, 2) tagdata = fsock.read(128) finally: fsock.close() if tagdata[:3] == "TAG": for tag, (start, end, parseFunc) in self.tagDataMap.items(): self[tag] = parseFunc(tagdata[start:end]) except IOError: pass def __setitem__(self, key, item): if key == "name" and item: self.__parse(item) FileInfo.__setitem__(self, key, item) def listDirectory(directory, fileExtList): "get list of file info objects for files of particular extensions" fileList = [os.path.normcase(f) for f in os.listdir(directory)] fileList = [os.path.join(directory, f) for f in fileList \ if os.path.splitext(f)[1] in fileExtList] def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): "get file info class from filename extension" subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] return hasattr(module, subclass) and getattr(module, subclass) or FileInfo return [getFileInfoClass(f)(f) for f in fileList] if __name__ == "__main__": for info in listDirectory("/music/_singles/", [".mp3"]): print "\n".join(["%s=%s" % (k, v) for k, v in info.items()]) print Gruß Zitieren Link zu diesem Kommentar
atomicid 10 Geschrieben 8. Juni 2005 Autor Melden Teilen Geschrieben 8. Juni 2005 bei dem oben stehendem handelt es sich um das auslesen der ID3 tags von mp3 files. das ist kein problem, weil das format spezifiziert ist. die dateiinfos stehen allerdings in einem ad-stream was eine komplet andere technologie ist (id3 tags sind direkter filecontent) dateiinfos = ntfs stream. muss mal anmerken, das das nicht sehr schön ist, das es darüber keine infos seitens MS gibt. schon alleine, das die solche ♣ sonderzeichen im namen benutzen macht es einem programmierer schwer. und dann noch dieser zeichengulasch im stream selbst. das ist ja quasi ein propritäres format in einem ohnehin schon propritärem produkt. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.