Erweiterte Dateieigenschaften

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von anba.

    Erweiterte Dateieigenschaften

    Hallo,
    ich bin absoluter Anfänger und habe mir mit Hilfe von einem Buch einen Code "zusammenkopiert", der auch soweit funktioniert.
    Es ist eine Konsolenanwendung.
    Zu meinem Glück fehlt mir jetzt nur noch der "Befehl" mit dem ich die "erweiterten Dateieigenschaften" einer Variable zuweisen kann. Ich habe schon ewig gegooogelt, aber leider nichts passendes gefunden.
    Konkret möchte ich von einer wtv Datei die "Sendungsbeschreibung" einer Variablen zuweisen. Wenn man mit dem Windows Mediacenter eine Fernseh/Radiosendung aufnimmt, dann landet das in einer wtv Datei. Mit der rechten Maustaste kann man die wtv Datei anclicken, dann auf Eigenschaften, dann auf Details, dann etwas runterscrollen, dort sieht man die Eigenschaft "Sendungsbeschreibung" - diese würde ich gerne in eine Variable einlesen - um Sie dann in eine andere Textdatei zu schreiben. Sicher gibt es da auch einen "Befehl" aber leider finde ich nichts. Mit "File.GetAttributes" komme ich jedenfalls nicht an die Eigenschaft "Sendungsbeschreibung".

    Bin für jede Hilfe dankbar.

    Grüße
    anba
    @anaba:: Willkommen im Forum. :thumbup:
    Meinst Du so was:

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo("D:\Temp\Test.jpg")
    2. Dim attr = fi.Attributes
    3. MessageBox.Show(attr.ToString)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    .wtv ist wohl was ganz neues dolles von M$ zur Filmkompression, vergleichbar .wmv (das hat ja auch son spezielles Zusatz-Info-System) oder so. Mit FileAttributes kommt man da wohl nicht weiter. Wie man allerdings weiterkommt, weiß ich auch nicht, google scheint sich v.a. damit zu beschäftigen, das nach avi oder wmv umzuwandeln.
    Versuchs mal hiermit:

    VB.NET-Quellcode

    1. Public Function GetUserDefinedFileProperty(fi As IO.FileInfo, propertyName As String) As String
    2. Dim shell As New Shell32.Shell()
    3. Dim folder As Shell32.Folder = shell.NameSpace(fi.DirectoryName)
    4. Dim propCount As Integer = folder.Items().Count
    5. For i As Integer = 0 To propCount - 1
    6. If folder.GetDetailsOf(folder, i).Equals(propertyName, StringComparison.InvariantCultureIgnoreCase) Then
    7. Dim fldItem As Shell32.FolderItem = folder.Items().Item(fi.Name)
    8. Dim fldItem2 As Shell32.FolderItem2 = DirectCast(fldItem, Shell32.FolderItem2)
    9. Return folder.GetDetailsOf(fldItem2, i)
    10. End If
    11. Next
    12. Return ""
    13. End Function

    Um die Funktion nutzen zu können, muss ein Verweis auf die shell32.dll hinzugefügt werden (Verweis hinzufügen -> Durchsuchen -> C:\Windows\System32\Shell32.dll)

    Aufruf:

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo(deineWtvDatei)
    2. Dim result As String = GetUserDefinedFileProperty(fi, "Sendungsbeschreibung")


    Nachtrag:
    Auf meinem System ist das Property "Sendungsbeschreibung" immer an Index i = 259. Keine Ahnung, ob das wirklich konstant ist, ich könnte es mir aber gut vorstellen. Wenn du ausschließlich die Sendungsbeschreibung brauchst, reicht evtl. auch folgende Funktion (ebenfalls Verweis auf shell32.dll benötigt):

    VB.NET-Quellcode

    1. Public Function GetSendungsbeschreibung(fi As IO.FileInfo) As String
    2. Dim shell As New Shell32.Shell()
    3. Dim folder As Shell32.Folder = shell.NameSpace(fi.DirectoryName)
    4. Dim fldItem As Shell32.FolderItem = folder.Items().Item(fi.Name)
    5. Dim fldItem2 As Shell32.FolderItem2 = DirectCast(fldItem, Shell32.FolderItem2)
    6. Return folder.GetDetailsOf(fldItem2, 259)
    7. End Function
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()

    Hallo zusammen,
    ich bin überwältigt. Es funktioniert jetzt wie gewünscht. Vielen Dank.

    @RodFromGermany: vielen Dank für Deinen Vorschlag. Ich habs Probiert aber als Grünschnabel bin ich an der Fehlermeldung "Deklaration erwartet" zu "MessageBox.Show(attr.ToString)" gescheitert - hier weiß ich einfach nicht weiter.

    @ErfinderDesRades: wtv ist nicht neu und auch nicht komprimiert, es ist einfach der Sat-Stream der vom Himmel kommt in eine Datei geschrieben und dann noch etwas Microsoft-Gedöns außenrum gebastelt. Es ist ähnlich den *.ts Dateien die z.B. jeder Technisat, Kathrein... DVB-S2 Receiver erzeugt. wtv Dateien kann man einfach in gängigere Formate umkopieren - da muß nix neu kodiert werden. Zum "umkopieren" verwendet man am besten den "wtv-converter ".

    @Arby: Deine zuletzt gepostete Lösung habe ich verwendet und diese funktionierte auf Anhieb. Einzig den Aufruf der Funktion mußte ich mir jetzt selbst "erdenken", das habe ich - mit Glück selber geschaft.
    Die For..Next Schleife, welche meine Filmordner durchläuft habe ich um diese 3 Zeilen erweitert.
    Nochmal vielen Dank.

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo(Filmname & ".wtv")
    2. Dim result As String = GetSendungsbeschreibung(fi)
    3. If File.Exists(Filmpfad & "" & Filmname & ".wtv") Then Handlung = GetSendungsbeschreibung(fi)


    Grüße
    anba

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „anba“ ()

    anba schrieb:

    Einzig den Aufruf der Funktion mußte ich mir jetzt selbst "erdenken", das habe ich - mit Glück selber geschaft.

    Ich hoffe ja wohl, dass das kein Glück, sondern Auffassung und Kombinationsgabe war... ;)

    anba schrieb:

    If File.Exists(Filmpfad & "\" & Filmname & ".wtv") Then Handlung = GetSendungsbeschreibung(fi)

    So umständlich? Dein Objekt fi hat doch bereits den vollen Pfad als Eigenschaft und die Sendungsbeschreibung hast du doch bereits zwei Zeilen vorher in einer Variablen gespeichert. Und wenn die Datei mal doch nicht existieren sollte, wird schon deine zweite Zeile nicht funktionieren (und vermutlich eine Exception werfen). Also besser und kürzer:

    VB.NET-Quellcode

    1. Dim fi = New IO.FileInfo(Filmname & ".wtv")
    2. If File.Exists(fi.FullName) Then Handlung = GetSendungsbeschreibung(fi)

    Vergleichs mit deinem Schnipsel und versuche zu verstehen...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    anba schrieb:

    Ich habs Probiert aber als Grünschnabel bin ich an der Fehlermeldung "Deklaration erwartet" ... gescheitert
    Dann warst Du leider nicht in der Lage, die 3 Zeilen per Copy und Paste in Deinen Programmrumpf zu übertragen, dieser 3-Zeiler funktioniert genau so, wie er da steht.
    Es gibt 2 Möglichkeiten:
    Die Datei existiert:

    Die Datei existiert nicht:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,
    Jetzt hab ich leider noch ein kleines Problem. Das Visual Studio Express 2013 für Windows Desktop hab ich hier auf dem Laptop mit Win7 Prof 64Bit. Da läuft das jetzt. Wenn ich dann auf Erstellen / Anwendung veröffentlichen clicke, dann wird ja das Setupgedöns erstellt. Dann installiere ich das auf meinem HTPC mit Windows Professional 8.1 mit Mediacenter 64Bit, dann scheint unter "259" doch nicht die Filmbeschreibung zu sein. Komisch. Das Programm stürzt nicht ab oder so, es bleibt lediglich die Filmbeschreibung leer. Muß ich da noch etwas beachten, da ja das shell32 eingebunden ist, das ist dann scheinbar auf Win 8.1 anders? Tj ich eben, leider völlig planlos.

    @RodFromGermany: Ich bin in der Konsolenanwendung, und du bist in der Windows-Forms-Andwendung?

    Grüße
    anba
    Dann probier mal die erste Funktion die ich oben gepostet habe statt der zweiten. Die erwartet einen zusätzlichen Parameter, dort gibst du dann den Namen der erweiterten Eigenschaft (also "Sendungsbeschreibung") an. Wie im Beispiel beschrieben.
    Die Frage ist nur, was dann passiert, wenn das auf einem nicht-deutschen Windows ausgeführt wird...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    anba schrieb:

    Ich bin in der Konsolenanwendung
    Ja und?
    Da hast Du einigen Aufwand, eine MessageBox anzeigen zu lassen. Das Ergebnis ist aber dasselbe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok,
    ich habe eben die erste Funktion getestet. Aber das funktioniert lieder nicht sofort. Erst wenn ich in Zeile 5 "propcount - 1" durch z. B. "300" ersetze dann funktioniert es, sowohl mit Win7 als auch mit Win8. Ich glaube da ist in der Funktion ein kleiner Fehler, propcount zählt die Eigenschaften des Ordners aber nicht der Datei, oder?. Bin aber leider nicht in der Lage das "richtig zu stellen".... ?(

    Wollte auch deine Funktion dahin ändern, daß er mir alle Attributnummern u. Namen einer wtv-Datei in ein textfile schreibt, aber irgendwie gelingt mir heute nix. :thumbdown:
    Denn, wenn ich die Schauspieler auslesen will, welche bei mir in den Dateieigenschaften unter "Abspann" stehen, dann funktioniert das auch nicht.
    Liegt ev. auch daran, daß wenn man in der Explorerleiste mit der rechten Maustaste die verfügbaren erweiterten Attribute anzeigt, das da "Abspann" gar nicht aufgelistet ist. Finde da aber auch kein Feld für Schauspieler....mann mann warum macht MS das alles sooo komplicated?

    Grüße
    anba
    *hust* Ich hab doch nur die Schreibweise vom TE "modifiziert" um zu zeigen, dass er - wenn er die FileInfo schon hat - den Pfad nicht nochmal extra zusammenbauen muss *hust* :D
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @Arby: Könntest du bitte nochmal über den code deiner 1. Variante sehen? Leider funktioniert der so bei mir nicht. Erst wenn ich in zeile 5 das "propcount - 1" durch 300 ersetze dann funktioniert es. Hast Du den code bei dir getestet?
    Grüße
    anba

    anba schrieb:

    Hast Du den code bei dir getestet?

    Ja, hatte ich. Ich hatte sogar ursprünglich eine Variante, wo er wirklich alle Eigenschaften von Index 0 bis Index propcount-1 einliest und in einer List(Of T) zurückgibt, aber das hatte sich als unperformant erwiesen, wenn man nur eine oder wenige Eigenschaften abfragen will.

    Welchen Wert hat die Variable propcount denn bei dir? Zusatzinfo: Ich hab gelesen du nutzt Windows 8, ich habe hier Windows 7 x64. Vielleicht liegt da irgendwo die Problematik begraben...
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @Arby: Ich habe jetzt alle Deine Codeschnipsel zumindest soweit verstanden, daß ich mir auch eine Prozedur schreiben konnte, welche mir alle erweiterten Dateieigenschaften mit Wert, Nr., Name in ein Textfile schreibt. Dadurch konnte ich mir alle Namen der erweiterten Dateieigenschaften "notieren". Dein code funktioniert bei mir nicht, da es sehr viele erweiterte Dateieigenschaften gibt, die gar nicht mit Werten belegt sind, dadurch hört dann deine Schleife einfach auf weiterzuzählen. Deshalb habe ich jetzt einfach meine Variante gewählt und als maxcount die Zahl 300 eingesetzt.

    Ich Programmiere auf dem Laptop unter win 7 Prof. 64Bit. Das fertige Programm teste ich dann zwischendurch auf mit Win 8 Prof. 64Bit.

    Leider habe ich jetzt noch mehr "komische Probleme" - ich weiß nicht ob ich euch hier weiter mit "doofen" Fragen nerven darf?

    Beispiel: Mein Progi erstellt mir jetzt alle nötigen Dateien vollautomatisch. Prima. Leider habe ich jetzt z. B. aber eine einzige wtv Datei, die mir einen Strich durch die Rechnung macht, da funzt das "System" nicht, dabei habe ich bemerkt, daß der Windows-Mediacenter bei jedem Start scheinbar selbst nochmal schreibend auf die erstellten xml Dateien zugreift, denn wenn ich diese Dateien mit Schreibschutz versehe, dann werden sie vom Mediacenter nicht mehr eingelesen. Komisch. Ohne Schreibschutz überschreibt mir das Mediacenter die zugehörige xml Datei von der Einen wtv Datei.

    Fürs Mediacenter kann man ja auch "Erweiterungen" Programmieren, kennt da jemand ein Entwicklerforum?

    Grüße
    anba