Ich versuche herauszufinden, wie man die erweiterten Dateieigenschaften in C# lesen/schreiben kann z. B. Kommentar, Bitrate, Zugriffsdatum, Kategorie usw., die Sie im Windows-Explorer sehen können. Irgendwelche Ideen, wie man das macht? EDIT: Ich werde hauptsächlich Videodateien lesen/schreiben (AVI/DIVX/...)
Antworten
Zu viele Anzeigen?GetDetailsOf()
Methode - Ruft Details über ein Element in einem Ordner ab. Zum Beispiel die Größe, den Typ oder den Zeitpunkt der letzten Änderung. Die Dateieigenschaften können je nach Windows-OS
Version.
List<string> arrHeaders = new List<string>();
Shell shell = new ShellClass();
Folder rFolder = shell.NameSpace(_rootPath);
FolderItem rFiles = rFolder.ParseName(filename);
for (int i = 0; i < short.MaxValue; i++)
{
string value = rFolder.GetDetailsOf(rFiles, i).Trim();
arrHeaders.Add(value);
}
Antwort von Jerker ist etwas einfacher. Hier ist ein Beispielcode, der funktioniert von MS :
var folder = new Shell().NameSpace(folderPath);
foreach (FolderItem2 item in folder.Items())
{
var company = item.ExtendedProperty("Company");
var author = item.ExtendedProperty("Author");
// Etc.
}
Für diejenigen, die shell32 nicht statisch referenzieren können, können Sie es wie folgt dynamisch aufrufen:
var shellAppType = Type.GetTypeFromProgID("Shell.Application");
dynamic shellApp = Activator.CreateInstance(shellAppType);
var folder = shellApp.NameSpace(folderPath);
foreach (var item in folder.Items())
{
var company = item.ExtendedProperty("Company");
var author = item.ExtendedProperty("Author");
// Etc.
}
- Nachdem ich mir eine Reihe von Lösungen in diesem Thread und anderswo angesehen habe wurde der folgende Code zusammengestellt. Dies ist nur zum Lesen einer Eigenschaft.
- Ich konnte nicht die Shell32.FolderItem2.ExtendedProperty Funktion nicht zum Laufen bringen. einen String-Wert nehmen und den richtigen Wert und Typ für diese Eigenschaft zurückgeben Eigenschaft zurückgeben... dies war für mich immer null und die Entwicklerreferenzressourcen waren sehr dünn.
- Le site WindowsApiCodePack scheint von Microsoft aufgegeben worden zu sein, was uns den folgenden Code beschert.
Verwendung:
string propertyValue = GetExtendedFileProperty("c:\\temp\\FileNameYouWant.ext","PropertyYouWant");
- gibt Ihnen den Wert der gewünschten erweiterten Eigenschaft als Zeichenkette für die angegebene Datei und den Eigenschaftsnamen zurück.
- Schleift nur so lange, bis es die angegebene Eigenschaft gefunden hat - nicht bis alle Eigenschaften gefunden werden, wie in einem Beispielcode
-
Funktioniert auf Windows-Versionen wie Windows Server 2008, wo Sie den Fehler erhalten "COM-Objekt vom Typ 'System.__ComObject' kann nicht auf den Schnittstellentyp 'Shell32.Shell' übertragen werden" wenn Sie nur versuchen, das Shell32-Objekt normal zu erstellen.
public static string GetExtendedFileProperty(string filePath, string propertyName) { string value = string.Empty; string baseFolder = Path.GetDirectoryName(filePath); string fileName = Path.GetFileName(filePath); //Method to load and execute the Shell object for Windows server 8 environment otherwise you get "Unable to cast COM object of type 'System.__ComObject' to interface type 'Shell32.Shell'" Type shellAppType = Type.GetTypeFromProgID("Shell.Application"); Object shell = Activator.CreateInstance(shellAppType); Shell32.Folder shellFolder = (Shell32.Folder)shellAppType.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { baseFolder }); //Parsename will find the specific file I'm looking for in the Shell32.Folder object Shell32.FolderItem folderitem = shellFolder.ParseName(fileName); if (folderitem != null) { for (int i = 0; i < short.MaxValue; i++) { //Get the property name for property index i string property = shellFolder.GetDetailsOf(null, i); //Will be empty when all possible properties has been looped through, break out of loop if (String.IsNullOrEmpty(property)) break; //Skip to next property if this is not the specified property if (property != propertyName) continue; //Read value of property value = shellFolder.GetDetailsOf(folderitem, i); } } //returns string.Empty if no value was found for the specified property return value; }
Hier ist eine Lösung für das Lesen - nicht Schreiben - der erweiterten Eigenschaften, basierend auf dem, was ich auf dieser Seite und unter Hilfe bei Shell32-Objekten .
Um es klar zu sagen: Das ist ein Hack. Es sieht aus wie dieser Code wird immer noch auf Windows 10 laufen, sondern wird auf einige leere Eigenschaften zu schlagen. Frühere Version von Windows sollte verwenden:
var i = 0;
while (true)
{
...
if (String.IsNullOrEmpty(header)) break;
...
i++;
Unter Windows 10 gehen wir davon aus, dass es etwa 320 Eigenschaften zu lesen gibt und überspringen einfach die leeren Einträge:
private Dictionary<string, string> GetExtendedProperties(string filePath)
{
var directory = Path.GetDirectoryName(filePath);
var shell = new Shell32.Shell();
var shellFolder = shell.NameSpace(directory);
var fileName = Path.GetFileName(filePath);
var folderitem = shellFolder.ParseName(fileName);
var dictionary = new Dictionary<string, string>();
var i = -1;
while (++i < 320)
{
var header = shellFolder.GetDetailsOf(null, i);
if (String.IsNullOrEmpty(header)) continue;
var value = shellFolder.GetDetailsOf(folderitem, i);
if (!dictionary.ContainsKey(header)) dictionary.Add(header, value);
Console.WriteLine(header +": " + value);
}
Marshal.ReleaseComObject(shell);
Marshal.ReleaseComObject(shellFolder);
return dictionary;
}
Wie bereits erwähnt, müssen Sie auf die Com-Baugruppe Interop.Shell32.
Wenn Sie eine STA-bezogene Ausnahme erhalten, finden Sie hier die Lösung:
Ausnahme bei Verwendung von Shell32 zum Abrufen erweiterter Dateieigenschaften
Ich habe keine Ahnung, wie diese Eigenschaftsnamen auf einem fremden System lauten würden, und konnte keine Informationen darüber finden, welche lokalisierbaren Konstanten zu verwenden sind, um auf das Wörterbuch zuzugreifen. Außerdem stellte ich fest, dass nicht alle Eigenschaften aus dem Dialogfeld "Eigenschaften" in dem zurückgegebenen Wörterbuch enthalten waren.
BTW dies ist furchtbar langsam und - zumindest auf Windows 10 - Parsing Daten in der Zeichenfolge abgerufen würde eine Herausforderung sein, so verwenden Sie diese scheint eine schlechte Idee zu sein, mit zu beginnen.
Unter Windows 10 sollten Sie auf jeden Fall die Windows.Storage-Bibliothek verwenden, die die SystemPhotoProperties, SystemMusicProperties usw. enthält. https://docs.microsoft.com/en-us/Windows/uwp/files/quickstart-getting-file-properties
Und schließlich habe ich eine viel bessere Lösung, die WindowsAPICodePack verwendet dort
Ich bin mir nicht sicher, für welche Arten von Dateien Sie die Eigenschaften schreiben wollen, aber taglib-sharp ist eine hervorragende Open-Source-Tagging-Bibliothek, die all diese Funktionen gut zusammenfasst. Es hat eine Menge von eingebauten Unterstützung für die meisten der beliebten Medien-Datei-Typen, sondern auch ermöglicht es Ihnen, mehr erweiterte Tagging mit so ziemlich jeder Datei zu tun.
EDIT : Ich habe den Link zu taglib sharp aktualisiert. Der alte Link funktionierte nicht mehr.
EDIT : Ich habe den Link gemäß dem Kommentar von kzu noch einmal aktualisiert.
- See previous answers
- Weitere Antworten anzeigen