Jump to content

Dateiinfo auslesen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Recommended Posts

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

Link to comment

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ß

Link to comment

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.

Link to comment
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...