Entwickler-Ecke

IO, XML und Registry - Alle Informationen zu einer ausgewählten Datei


Delete - Di 14.06.11 11:10
Titel: Alle Informationen zu einer ausgewählten Datei
Hallo Leute,

kennt Jemand eine Möglichkeit alle Informationen einer Datei anzuzeigen, bei FileInfo ist mir die Auswahl einfach zu klein, also wie wenn ich auf eine Datei mit der rechten Maustaste gehe, dann unter Eigenschaften und Details!?

Grüße BleachRukia


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Di 14.06.2011 um 14:59


Th69 - Di 14.06.11 11:44

Hallo,

es gibt noch die FileVersionInfo [http://msdn.microsoft.com/en-us/library/91sft6af.aspx]-Klasse, welche weitere Eigenschaften beinhaltet.

Und dann gibt es auch noch die Folder.GetDetailsOf [http://msdn.microsoft.com/en-us/library/bb787870%28v=vs.85%29.aspx]-Methode (ein Beispiel habe ich unter http://www.mycsharp.de/wbb2/thread.php?threadid=75863 gefunden).


Delete - Di 14.06.11 13:55

Danke erstmal für die tollen Links :)

Bin jetzt auf auf die Ultra id3 Library gestoßen die sehr gut ist um Musik Infos zu bekommen.

Aber gibt es da nicht eine andere Library die wikrlich alles an Infos ausgeben kann unabhängig von der Datei, wie wenn ich auf Eigenschaften gehe und dann auf Details ?

Grüße BleachRukia


Delete - Di 14.06.11 14:46

Was sind denn für die ALLE Informationen?


jaenicke - Di 14.06.11 14:58

Wenn du genau diese Anzeige willst, rufe doch einfach den Windows Dialog zu der Datei auf, dann sieht der Nutzer doch alles. :nixweiss:


Delete - Di 14.06.11 15:32

Hallo,

will halt spezial rausfiltern :)

Also ich lieste mal auf was ich dem Benutzer rausgeben möchte:

Für Bilder:

Breite,
Höhe,
Bildtiefe,
von welchem Programm es erstellt wurde,
Größe,
Format.

Bei Musik:

AlbumCover
Herausgeber,
Copyright,
Artist,
Album,
Jahr,
Titel,
Titelnummer,
Länge,
Genre,
Bitrate,
Größe,
Format.

Davon habe ich bisher selber herausgefunden:

Bei Bildern:

Breite,
Höhe,
Größe,
Format.

Bei Musik ohne UltraID3 (mit WMP):

Artist,
Album,
Titel,
Länge,
Genre,
Bitrate,
Größe,
Format.

Kennt da jemand eine Lösung für mein Problem ?

Grüße BleachRukia


Kha - Mi 15.06.11 13:22

Ab Vista sollten all diese Eigenschaften über die neue Shell-API abgefragt werden können. .NET-Bindings dafür gibt es im Windows API Code Pack [http://archive.msdn.microsoft.com/WindowsAPICodePack], damit habe ich z.B. Musik-Bewertungen unabhängig vom Container ausgelesen.


Delete - Sa 18.06.11 23:27

Vielen vielen vielen dank Kha, durch deine Antwort habe ich eine Informationsquelle gefunden die auf den ersten Blick fast unendlich wirkt :D

Mit diesem Code glaube ich kann ich fast alles abrufen, falls mir ihrgendwelche lücken auffallen sollten melde ich mich nochmal :)

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            OpenFileDialog o = new OpenFileDialog();

            if (o.ShowDialog() == DialogResult.OK)
            {
                Microsoft.WindowsAPICodePack.Shell.ShellFile tst = Microsoft.WindowsAPICodePack.Shell.ShellFile.FromFilePath(o.FileName);
                this.label1.Text = tst.Properties.System...
            }


Grüße BleachRukia

Moderiert von user profile iconKha: C#-Tags hinzugefügt


Delete - So 19.06.11 18:56

Hallo Leute,

sind jetzt noch 2 Probleme aufgetreten die ich nicht lösen konnte, vielleicht wisst ihr ja die Lösung.

Mit diesem Code hier:


C#-Quelltext
1:
FileDetails.Properties.System.Media.Duration.Value;                    


hatte ich versucht die Dauer einer Musik/Video Datei anzuzeigen, nur leider wird mir das Ergebnnis, glaube ich, in Nanosekunden angezeigt :(

Beim 2. Problem:


C#-Quelltext
1:
this.pictureBox1.Image = FileDetails.Thumbnail.Bitmap;                    


hatte ich versucht ein Album Cover in eine pBox zu laden, das ist mir auch gut gelungen, sogar kann ich Thumbnail für Videos in meiner pBox anzeigen lassen.
Nur leider wenn die angegebene Musik Datei kein Album Cover hat, wird das Default Thumbnail angezeigt :(
Hatte es schon versucht mit if(FileDetails.Thumbnail.Bitmap != null) aber da das Thumbnail immer ein Bild hat, hat das nicht funktioniert :(
Danach hatte ich versucht mit if(FileDetails.Thumbnail.Bitmap.Width != 256 && FileDetails.Thumbnail.Bitmap.Heigth != 256) aber mit diesem Code kann ich dann nicht mehr die Thumbnail der Videos sehen und auch manche Album Cover nicht mehr :(

Weißt jemand eine Lösung für die 2 Probleme ?

Grüße BleachRukia


jaenicke - So 19.06.11 19:10

user profile iconBleachRukia hat folgendes geschrieben Zum zitierten Posting springen:
hatte ich versucht die Dauer einer Musik/Video Datei anzuzeigen, nur leider wird mir das Ergebnnis, glaube ich, in Nanosekunden angezeigt :(
Wie du in der Dokumentation ja sicher nachgelesen hast (:roll:) sind es 100ns Schritte:
MSDN Dokumentation [http://msdn.microsoft.com/en-us/library/bb787399.aspx] hat folgendes geschrieben:
Represents the actual play time of a media file and is measured in 100ns units, not milliseconds.
Das musst du also nur umrechnen. ;-)


Delete - Mo 20.06.11 14:03

Hallo Leute,

mir ist aufgefallen das z.b. MKV Dateien in ihren Details keine Bitrate aufgelistet haben, also kann ich mir die auch nicht anzeigen lassen, und bei FLV Dateien werden überhaupt keine Video Informationen angezeigt :(

Weiß jemand wie ich bestimmte Informationen direkt aus einer ausgewählten Datei auslesen kann ?

Grüße BleachRukia


jaenicke - Mo 20.06.11 14:31

Da musst du dir die Definition des Dateiformats anschauen und das entsprechend umsetzen.
Für MKV z.B.:
http://www.matroska.org/technical/specs/index.html
Aber da reicht eine kurze Suche bei Google...

Ein Grund, dass keine Bitrate angezeigt wird, kann sein, dass diese variabel ist und keine festen Grenzen hat.


Delete - Mo 20.06.11 14:36

Hallo,

vielen vielen dank für die Antwort, nur wie setzt man sowas um, habe sowas voher noch nie gemacht, kannst du mir ein Code Beispiel geben ?

Grüße BleachRukia


jaenicke - Mo 20.06.11 14:45

Hier findest du ein Beispiel:
http://msdn.microsoft.com/de-de/library/e4y2dch9.aspx
In diesem Fall brauchst du das zweite Beispiel mit dem BinaryReader.


Delete - Mo 20.06.11 16:54

Hallo,

wenn ich versuche eine Datei zu lesen bekomme ich in der while Schleife bei br.PeekChar() folgende Fehlermeldung:

Der Ausgabe-Zeichenpuffer zu klein für die codierten Zeichen. Codierung von "Unicode (UTF-8)" in Ausweichposition "System.Text.DecoderReplacementFallback".
Parametername: chars

Habe versucht die Datei in einer richtextbox anzuzeigen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
           OpenFileDialog o = new OpenFileDialog();
            if (o.ShowDialog() == DialogResult.OK)
            {
                string FILE_NAME = o.FileName;

                if (!File.Exists(FILE_NAME))
                {
                    return;
                }
                FileStream f = new FileStream(FILE_NAME, FileMode.Open,
                    FileAccess.Read, FileShare.Read);
                // Create an instance of BinaryReader that can
                // read bytes from the FileStream.
                using (BinaryReader br = new BinaryReader(f))
                {
                    byte input;
                    // While not at the end of the file, read lines from the file.
                    while (br.PeekChar() > -1)
                    {
                        input = br.ReadByte();
                        richTextBox1.Text += input;
                    }
                }

Was mache ich falsch ?

Grüße BleachRukia


Kha - Mo 20.06.11 17:18

Da haben die MSDN-Leute wohl nicht weit genug gedacht :lol: . Du solltest stattdessen auf Position und Length von f prüfen können.


Delete - Mo 20.06.11 17:35

Hallo Leute,

habe es jetzt auf Position/Length prüfen lassen, da kommen am Anfang nur ganz viele verschiedne Zahlen und danach ist das Programm für eine ganze Zeit nicht mehr ansprechbar aber am Ende bekomme ich diese Fehlermeldung:

Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x4567b8 zum COM-Kontext 0x456928 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

Habe es mit diesme Code versucht gehabt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
            OpenFileDialog o = new OpenFileDialog();
            if (o.ShowDialog() == DialogResult.OK)
            {
                string FILE_NAME = o.FileName;

                if (!File.Exists(FILE_NAME))
                {
                    return;
                }
                FileStream f = new FileStream(FILE_NAME, FileMode.Open,
                    FileAccess.Read, FileShare.Read);
                // Create an instance of BinaryReader that can
                // read bytes from the FileStream.
                using (BinaryReader br = new BinaryReader(f))
                {
                    byte input;
                    // While not at the end of the file, read lines from the file.
                    while (br.BaseStream.Position > -1)
                    {
                        input = br.ReadByte();
                        richTextBox1.Text += input;
                    }
                }
            }


Aber ich wollte ja eigentlich nur Infos zur Datei rausfiltern wie z.b bei Bilder/Video die Breite und Höhe, ich weiß das geht auch über die pBox aber ich wollte einzelne Infos direkt aus der Datei rauslesen.

Grüße BleachRukia


Th69 - Mo 20.06.11 18:06

Hallo BleachRukia,

schöne Endlosschleife ;-)

So ist es von Kha gedacht:

C#-Quelltext
1:
while (br.BaseStream.Position < br.BaseStream.Length)                    


Delete - Mo 20.06.11 18:28

Hallo,

habe es jetzt so geändert wie Kha es sich gedacht hat nur das Ergebniss bleibt leider das selbe :(, bekomme wieder nur Zahlen und nach sehr lange Zeit diese Fehlermeldung:

Die CLR konnte 60 Sekunden lang keinen Übergang vom COM-Kontext 0x122ed8 zum COM-Kontext 0x123048 durchführen. Der Thread, der Besitzer des Zielkontexts/-apartments ist, wartet entweder, ohne Meldungen zu verschieben, oder verarbeitet eine äußerst lang dauernde Operation, ohne Windows-Meldungen zu verschieben. Eine solche Situation beeinträchtigt in der Regel die Leistung und kann sogar dazu führen, dass die Anwendung nicht mehr reagiert oder die Speicherauslastung immer weiter zunimmt. Zur Vermeidung dieses Problems sollten alle STA-Threads (Singlethread-Apartment) primitive Typen verwenden, die beim Warten Meldungen verschieben (z.B. CoWaitForMultipleHandles), und bei lange dauernden Operationen generell Meldungen verschieben.

Diesmal war es dieser Code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
            OpenFileDialog o = new OpenFileDialog();
            if (o.ShowDialog() == DialogResult.OK)
            {
                string FILE_NAME = o.FileName;

                if (!File.Exists(FILE_NAME))
                {
                    return;
                }
                FileStream f = new FileStream(FILE_NAME, FileMode.Open,
                    FileAccess.Read, FileShare.Read);
                // Create an instance of BinaryReader that can
                // read bytes from the FileStream.
                using (BinaryReader br = new BinaryReader(f))
                {
                    byte input;
                    // While not at the end of the file, read lines from the file.
                    while (br.BaseStream.Position < br.BaseStream.Length)
                    {
                        input = br.ReadByte();
                        richTextBox1.Text += input;
                    }
                }
            }


Grüße BleachRukia


jaenicke - Mo 20.06.11 18:49

user profile iconBleachRukia hat folgendes geschrieben Zum zitierten Posting springen:
bekomme wieder nur Zahlen
Wieso nur? Das ist der Dateiinhalt in Asciicodes. :nixweiss:
Dass du die einzelnen Zeichencodes nicht trennst, ist natürlich dabei wenig sinnvoll.

Vergleiche das einfach mit einem Hexeditor, hexadezimal dargestellt steht da das gleiche.

user profile iconBleachRukia hat folgendes geschrieben Zum zitierten Posting springen:
und nach sehr lange Zeit diese Fehlermeldung:
Was passiert denn, wenn du in die Schleife einen haltepunkt setzt? Ändert sich die Positionsangabe denn? Sonst ist das nach wie vor eine Endlosschleife.


Delete - Mo 20.06.11 19:25

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconBleachRukia hat folgendes geschrieben Zum zitierten Posting springen:
bekomme wieder nur Zahlen
Wieso nur? Das ist der Dateiinhalt in Asciicodes. :nixweiss:
Dass du die einzelnen Zeichencodes nicht trennst, ist natürlich dabei wenig sinnvoll.

Vergleiche das einfach mit einem Hexeditor, hexadezimal dargestellt steht da das gleiche.

user profile iconBleachRukia hat folgendes geschrieben Zum zitierten Posting springen:
und nach sehr lange Zeit diese Fehlermeldung:
Was passiert denn, wenn du in die Schleife einen haltepunkt setzt? Ändert sich die Positionsangabe denn? Sonst ist das nach wie vor eine Endlosschleife.


Hallo,

von Hexeditor, hexadezimal habe ich mal gelesen gehabt aber habe überhaupt keine Erfahrung damit.

Habe einen Haltepunkt in die Schleife gesetzt, das Programm gestartet, danach eine Datei ausgewählt, jetzt fügt das Programm garnichts mehr in die richtextbox ein und halt beim Punkt an.

Gibt es da nicht sowas wie wenn ich eine Datei auswähle, und dann soetwas wie einen Suchbegriff eingebe,
wie z.b. suche mir den Artist der aus der ausgewählten Datei heraus ?

Grüße BleachRukia


jaenicke - Mo 20.06.11 20:00

Ja, dann hält das Programm dort an. Und dann kannst du mit F11 schrittweise durchgehen und schauen was passiert. ;-)

Und zur letzten Frage: Es mag da etwas geben, aber irgendjemand muss es dann auch schon geschrieben haben. Von alleine kommt das nicht.
Ob es da etwas Passendes gibt, weiß ich nicht, aber wenn wäre es bei Google zu finden.


Delete - Mo 20.06.11 21:16

Hallo,

bin das jetzt durchgegangen mit F11 und wie es aussieht bin ich wieder in einer Endlosschleife gelandet :(

Zitat:

Und zur letzten Frage: Es mag da etwas geben, aber irgendjemand muss es dann auch schon geschrieben haben. Von alleine kommt das nicht.
Ob es da etwas Passendes gibt, weiß ich nicht, aber wenn wäre es bei Google zu finden.


Weiß jemand wie man so etwas schreiben kann ?

Grüße BleachRukia


jaenicke - Mo 20.06.11 22:00

Also bei mir funktioniert der Code problemlos. Allerdings kann es natürlich auch eine Weile dauern, denn so viele Daten byteweise auszulesen dauert halt... und wenn die dann noch als Text in ein RichEdit kommen sollen... :shock:

Nimm dir einfach eine kleinere Datei oder lies nur die ersten X Bytes, mehr brauchst du doch ohnehin nicht. Abgesehen davon:
Im Debugger siehst du ja auch wie weit der Vorgang ist. Du müsstest nur halt mal hinschauen (bzw. die Maus über Position usw. halten...):

CsDebugger2

Du siehst hier z.B., dass die aktuelle Position 7803 ist.


jaenicke - Mo 20.06.11 22:02

// EDIT: Doppelpost


Kha - Mo 20.06.11 22:35

Eine Endlosschleife wird ReadByte übrigens sowieso nicht zulassen ;) . Es passiert einfach das, was in der Fehlermeldung steht: Der GUI-Thread ist zu lange blockiert, was am zeichenweisen Aufaddieren auf Text liegen wird.


Delete - Di 21.06.11 00:33

Hallo,

habe mir jetzt mal die ersten 20 Zaheln getrennt in der rbox anzeigen lassen und danach durch einen Ascii übersetzer gejagt, da kommt auch nur Blödsinn bei raus, so langsam glaube ich nicht mehr das man mit diesem Code tatsächlich einzelne verständliche Informationen rausfiltern und anzeigen kann :(


jaenicke - Di 21.06.11 07:30

Was willst du mit Ascii? Denkst du in der Datei steht als Text drin was für Informationen in dem Video stehen? Dann wäre die Datei hundertmal so groß...

Das sind einfach nur einzelne Bytes, die z.B. als Zahlen interpretiert werden müssen. Was genau welches Byte heißt, steht ja in der Spezifikation des entsprechenden Dateityps, wie in dem Link zum MKV Format oben.


Delete - Di 21.06.11 22:07

Hallo Leute,

vielen vielen dank erst einmal für die vielen Antworten und die Geduld, merke aber das das rauslesen von Infos aus Dateien direkt, doch noch zu schwer für mich ist,
werde bei dem Windows API Code Pack das mir Kha empfohlen hat bleiben, vielen dank nochmal Kha :)

jaenicke dir möchte ich auch noch einmal danken, dafür das du dir die Zeit genommen hast und versucht hast es mir zu erklären :)

Liebe Grüße BleachRukia