Eigene Dateiattribute sieht man in Windows immer mal wieder, bspw. bei Office-Dateien. Dort kann man Titel, Autor und andere Dinge angeben und anzeigen lassen.
Aber wie speichere ich solche Attribute eigentlich?
Zuerst einmal benötigt man eine von Microsoft entwickelte Library namens „DSO OLE Document Property Reader“, diese habe ich einmal in der 64 und 32 bit Version angehängt: dsofile.

Erstellt nun ein neues Projekt und fügt eine COM Referenz auf die Library hinzu.

Danach solltet ihr den namespace einbinden können:

 using DSOFile; 

Als nächster Schritt müsst ihr ein Objekt anlegen, welches die Attribute/Properties handlet.

 OleDocumentProperties myFile = new DSOFile.OleDocumentProperties(); 

Öffnet nun die Datei:

 myFile.Open(@"MYFILEPATHHERE", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault);

Nun könnt ihr alle Attribute auslesen. Durchlauft dazu einfach die Liste mit den Attributen:

 foreach (DSOFile.CustomProperty property in myFile.CustomProperties)
                {
                   property.Name; //Der Name/Bezeichner des Attributes
                   property.get_Value(); //Der Wert des Attributes
                }

Um ein bestimmtes Attribut zu ändern, durchlauft ihr wie oben die Liste und sucht nach dem entsprechenden Attributenbezeichner (bspw. via if-Abfrage):

 foreach (DSOFile.CustomProperty property in myFile.CustomProperties)
                {
                  if (property.Name == "meinBezeichner")
                    {
                        //Property exists
                        property.set_Value(ref myValue); //setzt den Wert des Attributes auf den Inhalt des object myValue
                    }
                }

Wollt ihr einen ganz neues Attribut anlegen, ist die Methode myFile.CustomProperties.Add(...); das was ihr sucht:

    myFile.CustomProperties.Add("meinBezeichner", ref myValue); 

Nach jedem Lese-/Schreibzugriff muss die Datei geschlossen werden, ansonsten bleibt sie dauerhaft geöffnet und kann nicht mehr bearbeitet werden:

 myFile.Close(); //Überladung mit bool -> true, Datei speichern 

Man kann aber auch explizit den Speichervorgang aufrufen:

 myFile.Save(); 

Nun könnt ihr nach Belieben Attribute hinzufügen und auslesen.
Allerdings ist es nicht sonderlich schön, da man zur Anzeige des Attributes immer ein zusätzliches Programm braucht.
Wie man eine Anzeige in den Explorer integriert, erfahrt ihr in einem anderen Beitrag.

Ein Beispielprojekt findet ihr hier: CustomFileProperties.