Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read/Write 'Extended' file properties (C#)

I'm trying to find out how to read/write to the extended file properties in C# e.g. Comment, Bit Rate, Date Accessed, Category etc that you can see in Windows explorer. Any ideas how to do this? EDIT: I'll mainly be reading/writing to video files (AVI/DIVX/...)

like image 814
David Hayes Avatar asked Oct 20 '08 21:10

David Hayes


2 Answers

For those of not crazy about VB, here it is in c#:

Note, you have to add a reference to Microsoft Shell Controls and Automation from the COM tab of the References dialog.

public static void Main(string[] args) {     List<string> arrHeaders = new List<string>();      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)}");         }     } } 
like image 137
csharptest.net Avatar answered Sep 20 '22 14:09

csharptest.net


Solution 2016

Add following NuGet packages to your project:

  • Microsoft.WindowsAPICodePack-Shell by Microsoft
  • Microsoft.WindowsAPICodePack-Core by Microsoft

Read and Write Properties

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(); 

Important:

The file must be a valid one, created by the specific assigned software. Every file type has specific extended file properties and not all of them are writable.

If you right-click a file on desktop and cannot edit a property, you wont be able to edit it in code too.

Example:

  • Create txt file on desktop, rename its extension to docx. You can't edit its Author or Title property.
  • Open it with Word, edit and save it. Now you can.

So just make sure to use some try catch

Further Topic: Microsoft Docs: Implementing Property Handlers

like image 39
Martin Schneider Avatar answered Sep 19 '22 14:09

Martin Schneider