Windows API Code Pack – Windows 7 Libraries in eigenen Applikationen nutzen

Written on October 28, 2009

Microsoft hat bereits vor einiger Zeit das Windows API Code Pack veröffentlicht, mit dem es möglich ist, Funktionen, die mit Windows 7 neu eingeführt wurden (und auch solche, die teilweise bereits in älteren Systemen verfügbar waren), zu nutzen.

Eines dieser neuen Features sind sog. Bibliotheken oder Libraries.

Diese ermöglichen es dem Anwender mehrere über das System verteilte Ordner (auch Netzwerkpfade und Ordner auf Wechseldatenträgern wie USB-Sticks) unter einem Sammelbegriff zusammenzufassen und hierüber anzusprechen.

Standardmäßig sind in Windows 7 folgende Libraries vorhanden:

  • Documents
  • Music
  • Pictures
  • Videos

Die Definitionen der Libraries liegen im Verzeichnis %appdata%\Microsoft\Windows\Libraries als XML-Dateien mit der Endung .ms-library.

Um Libraries mittels des Windows API Code Packs anzusprechen wird zunächst eine Referenz auf Microsoft.WindowsAPICodePack.Shell benötigt:

Referenz auf Microsoft.WindowsAPICodePack.Shell

Alle Methoden, die zum Erstellen, Laden und Bearbeiten von Libraries finden sich in der Klasse ShellLibrary.

Laden von Libraries

Das Laden von Libraries ist wie folgt möglich:

ShellLibrary library = ShellLibrary.Load(KnownFolders.PicturesLibrary, false);

Dies lädt die vordefinierte Pictures Library.

Um eigene Libraries zu laden, kann folgende Überladung verwendet werden:

ShellLibrary library = ShellLibrary.Load("Meine Library", false);

Bearbeiten von Libraries

Beim Bearbeiten von Libraries gibt es mehrere Möglichkeiten -- zunächst könnte es z.B. interessant sein, zu erfahren, welche Ordner in der Library bereits enthalten sind:

foreach (ShellFolder shellFolder in library)
{
    Console.WriteLine(shellFolder.Name);
}

Das Resultat sieht erwartungsgemäß so aus:

Library: enthaltene Ordner

Mittels

shellFolder.ParsingName

kann man auch den kompletten Pfad des Ordners ausgeben lassen.

Außerdem ist es natürlich auch möglich, Ordner zur Library hinzufügen -- dies geht auf zwei Arten:

Console.WriteLine("Welcher Ordner soll hinzugefügt werden?");
string newFolder = Console.ReadLine();
library.Add(newFolder);

führt zu folgendem Ergebnis:

Library: Ordner hinzufügen

Library: Ordner hinzugefügt

Die zweite Variante ist für den Anwender etwas komfortabler und weniger fehleranfällig bei den Eingaben:

ShellLibrary.ShowManageLibraryUI(
    library.Name,
    IntPtr.Zero,
    "Ein Gruß von der Konsolenanwendung",
    "Bitte verwalten Sie die Picture-Library nach Ihren Wünschen...",
    true);  

Library-Verwaltung von der Console gestartet

Wie man sieht, wird der Standard-Dialog zur Verwaltung von Libraries gestartet.

Das Löschen von Ordner aus der Library geht aber nicht nur hierüber, sondern auch per

library.Remove("C:\\Bilder");

Libraries erstellen

Natürlich möchte man nicht nur bestehende Libraries verwalten, sondern auch neue erstellen.

Dies ist möglich mittels:

ShellLibrary library = new ShellLibrary("Meine neue Library", false);

Der Typ der enthaltenen Elemente kann mit

library.LibraryType = LibraryFolderType.Documents;

entsprechend den eigenen Bedürfnissen angepasst werden.

Ordnerinhalte der Library auslesen

Möchte man alle Ordner und Dateien der Library auslesen, kann man dies folgenden Codezeilen erledigen:

static void Main(string[] args)
{
    ShellLibrary library = ShellLibrary.Load(KnownFolders.PicturesLibrary,true);
    List allFilesInLibrary = new List();
    foreach (ShellFolder folder in library)
    {
        GetFilesRecursive(folder, allFilesInLibrary);
    }

    foreach (ShellFile shellFile in allFilesInLibrary)
    {
        Console.WriteLine(shellFile.Name);
    }
    Console.ReadLine();
}

static void GetFilesRecursive(ShellFolder parentFolder, List files)
{
    foreach (ShellObject shellObject in parentFolder)
    {
        ShellFile shellFile = shellObject as ShellFile;
        if (null != shellFile)
        {
            files.Add(shellFile);
        }

        ShellFolder shellFolder = shellObject as ShellFolder;
        if (shellFolder != null)
        {
            GetFilesRecursive(shellFolder, files);
        }
    }
}

Der Aufruf fördert folgende Files ans Tageslicht:

Dateien in der Library

Leider habe ich bisher noch keinen Weg gefunden, um Libraries zu löschen...