Leggi / scrivi proprietà file “estese” (C #)

Sto cercando di scoprire come leggere / scrivere sulle proprietà estese del file in C # ad es. Commenti, bit rate, data di accesso, categoria ecc. Che puoi vedere in Windows Explorer. Qualche idea su come fare questo? EDIT: Principalmente sto leggendo / scrivendo su file video (AVI / DIVX / …)

Per chi non è pazzo di VB, eccolo in C #:

Nota, devi aggiungere un riferimento a Microsoft Shell Controls and Automation dalla scheda COM della finestra di dialogo Riferimenti.

public static void Main(string[] args) { List arrHeaders = new List(); Shell32.Shell shell = new Shell32.Shell(); Shell32.Folder objFolder; objFolder = shell.NameSpace(@"C:\temp\testprop"); for( int i = 0; i < short.MaxValue; i++ ) { string header = objFolder.GetDetailsOf(null, i); if (String.IsNullOrEmpty(header)) break; arrHeaders.Add(header); } foreach(Shell32.FolderItem2 item in objFolder.Items()) { for (int i = 0; i < arrHeaders.Count; i++) { Console.WriteLine( $"{i}\t{arrHeaders[i]}: {objFolder.GetDetailsOf(item, i)}"); } } } 

C’è un articolo CodeProject per un lettore ID3. E un thread su kixtart.org che ha più informazioni per altre proprietà. Fondamentalmente, è necessario chiamare il metodo GetDetailsOf() sull’object shell della cartella per shell32.dll .

Questo esempio in VB.NET legge tutte le proprietà estese:

 Sub Main() Dim arrHeaders(35) Dim shell As New Shell32.Shell Dim objFolder As Shell32.Folder objFolder = shell.NameSpace("C:\tmp") For i = 0 To 34 arrHeaders(i) = objFolder.GetDetailsOf(objFolder.Items, i) Next For Each strFileName In objfolder.Items For i = 0 To 34 Console.WriteLine(i & vbTab & arrHeaders(i) & ": " & objfolder.GetDetailsOf(strFileName, i)) Next Next End Sub 

È necessario aggiungere un riferimento a Microsoft Shell Controls and Automation dalla scheda COM della finestra di dialogo Riferimenti .

Soluzione 2016

Aggiungi i seguenti pacchetti NuGet al tuo progetto:

  • Microsoft.WindowsAPICodePack-Shell di Microsoft
  • Microsoft.WindowsAPICodePack-Core di Microsoft

Leggi e scrivi proprietà

 using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Shell.PropertySystem; string filePath = @"C:\temp\example.docx"; var file = ShellFile.FromFilePath(filePath); // Read and Write: string[] oldAuthors = file.Properties.System.Author.Value; string oldTitle = file.Properties.System.Title.Value; file.Properties.System.Author.Value = new string[] { "Author #1", "Author #2" }; file.Properties.System.Title.Value = "Example Title"; // Alternate way to Write: ShellPropertyWriter propertyWriter = file.Properties.GetPropertyWriter(); propertyWriter.WriteProperty(SystemProperties.System.Author, new string[] { "Author" }); propertyWriter.Close(); 

Importante:

Il file deve essere valido, creato dal software assegnato specifico. Ogni tipo di file ha proprietà di file estese specifiche e non tutte sono scrivibili.

Se fai clic con il pulsante destro del mouse su un file sul desktop e non puoi modificare una proprietà, non sarai in grado di modificarlo anche nel codice.

Esempio:

  • Crea file txt sul desktop, rinomina la sua estensione in docx. Non è ansible modificare la proprietà Author o Title .
  • Aprilo con Word, modificalo e salvalo. Ora puoi.

Quindi assicurati di usare un po ‘di try catch

Ulteriore argomento: MSDN: implementazione dei gestori di proprietà

Grazie ragazzi per questa discussione! Mi ha aiutato quando volevo capire la versione del file di un exe. Tuttavia, avevo bisogno di capire da solo l’ultimo bit di ciò che viene chiamato Extended Properties.

Se apri le proprietà di un file exe (o dll) in Esplora risorse, ottieni una scheda Versione e una vista delle Proprietà estese di quel file. Volevo accedere a uno di quei valori.

La soluzione a questo è l’indicizzatore delle proprietà FolderItem.ExtendedProperty e se si rilasciano tutti gli spazi nel nome della proprietà, si otterrà il valore. Ad esempio, la versione del file va su FileVersion, e lì ce l’hai.

Spero che questo aiuti chiunque altro, ho pensato di aggiungere queste informazioni a questo thread. Saluti!

Metodo GetDetailsOf() : recupera i dettagli su un elemento in una cartella. Ad esempio, la sua dimensione, tipo, o il tempo della sua ultima modifica. Le proprietà del file possono variare in base alla Windows-OS del Windows-OS .

 List arrHeaders = new List(); 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); } 

La risposta di Jerker è un po ‘più semplice. Ecco il codice di esempio che funziona da MS :

 var folder = new Shell().NameSpace(folderPath); foreach (FolderItem2 item in folder.Items()) { var company = item.ExtendedProperty("Company"); var author = item.ExtendedProperty("Author"); // Etc. } 

Per coloro che non possono fare riferimento a shell32 staticamente, puoi invocarlo dynamicmente in questo modo:

 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. } 
  • Dopo aver esaminato un numero di soluzioni su questo thread e altrove, è stato creato il seguente codice. Questo è solo per leggere una proprietà.
  • Non riuscivo a far funzionare la funzione Shell32.FolderItem2.ExtendedProperty, si supponeva che prendesse un valore stringa e restituisse il valore e il tipo corretto per quella proprietà … questo era sempre nullo per me e le risorse di riferimento per gli sviluppatori erano molto sottili.
  • WindowsApiCodePack sembra essere stato abbandonato da Microsoft che ci porta il codice qui sotto.

Uso:

 string propertyValue = GetExtendedFileProperty("c:\\temp\\FileNameYouWant.ext","PropertyYouWant"); 
  1. Restituirà il valore della proprietà estesa desiderata come stringa per il file e il nome della proprietà specificati.
  2. Solo cicli fino a quando non trova la proprietà specificata – non finché tutte le proprietà non vengono scoperte come un codice di esempio
  3. Funzionerà su versioni di Windows come Windows server 2008 in cui verrà visualizzato l’errore “Imansible eseguire il cast dell’object COM di tipo” System .__ ComObject “nel tipo di interfaccia” Shell32.Shell “” se solo si tenta di creare l’object Shell32 normalmente.

     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; } 

Non sono sicuro di quali tipi di file stai provando a scrivere le proprietà ma taglib-sharp è un’eccellente libreria di tagging open source che avvolge tutte queste funzionalità in modo piacevole. Ha un sacco di supporto incorporato per la maggior parte dei popolari tipi di file multimediali, ma consente anche di eseguire tag più avanzati con praticamente tutti i file.

EDIT: ho aggiornato il link a taglib sharp. Il vecchio link non funzionava più.

EDIT: aggiornato il collegamento ancora una volta per il commento di kzu.