Freigeben über


Dateien und Ordner in den Bibliotheken "Musik", "Bilder" und "Videos"

Fügen Sie den entsprechenden Bibliotheken vorhandene Ordner mit Musik, Bildern oder Videos hinzu. Sie können Ordner auch aus Bibliotheken entfernen, die Liste der Ordner in einer Bibliothek abrufen und gespeicherte Fotos, Musik und Videos entdecken.

Eine Bibliothek ist eine virtuelle Sammlung von Ordnern, die standardmäßig einen bekannten Ordner sowie alle anderen Ordner enthält, die der Benutzer der Bibliothek mithilfe Ihrer App oder einer der integrierten Apps hinzugefügt hat. Beispielsweise enthält die Bildbibliothek standardmäßig den bekannten Ordner "Bilder". Der Benutzer kann Ordner hinzufügen oder aus der Bildbibliothek entfernen, indem er Ihre App oder die integrierte Fotos-App verwendet.

Voraussetzungen

  • Grundlegendes zur asynchronen Programmierung für UWP-Apps (Universelle Windows-Plattform)

    Sie können lernen, wie man asynchrone Apps in C# oder Visual Basic schreibt, siehe Aufrufen asynchroner APIs in C# oder Visual Basic. Informationen zum Schreiben asynchroner Apps in C++ finden Sie unter Asynchrone Programmierung in C++-.

  • Zugriffsberechtigungen für den Speicherort

    Öffnen Sie in Visual Studio die App-Manifestdatei im Manifest-Designer. Wählen Sie auf der Seite Funktionen die Bibliotheken aus, die Ihre App verwaltet.

    • Musikbibliothek
    • Bildbibliothek
    • Video-Bibliothek

    Weitere Informationen finden Sie unter Dateizugriffsberechtigungen.

Abrufen eines Verweises auf eine Bibliothek

Hinweis

Denken Sie daran, die entsprechende Funktion zu deklarieren. Weitere Informationen finden Sie unter App-Funktionsdeklarationen .  

Um einen Verweis auf die Musik-, Bilder- oder Videobibliotheken des Benutzers zu erhalten, rufen Sie die Methode StorageLibrary.GetLibraryAsync auf. Geben Sie den entsprechenden Wert aus der KnownLibraryId--Aufzählung an.

var myPictures = await Windows.Storage.StorageLibrary.GetLibraryAsync(Windows.Storage.KnownLibraryId.Pictures);

Rufen Sie die Liste der Ordner in einer Bibliothek ab

Um die Liste der Ordner in einer Bibliothek abzurufen, rufen Sie den Wert der StorageLibrary.Folders-Eigenschaft ab.

using Windows.Foundation.Collections;
IObservableVector<Windows.Storage.StorageFolder> myPictureFolders = myPictures.Folders;

Abrufen des Ordners in einer Bibliothek, in der neue Dateien standardmäßig gespeichert werden

Um den Ordner in einer Bibliothek abzurufen, in der neue Dateien standardmäßig gespeichert werden, rufen Sie den Wert der StorageLibrary.SaveFolder-Eigenschaft ab.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Hinzufügen eines vorhandenen Ordners zu einer Bibliothek

Um einer Bibliothek einen Ordner hinzuzufügen, rufen Sie die Methode StorageLibrary.RequestAddFolderAsyncauf. Wenn Sie beispielsweise die Bildbibliothek aufrufen, wird beim Aufrufen dieser Methode dem Benutzer ein Ordnerauswahlfenster mit der Schaltfläche "Diesen Ordner zu den Bildern hinzufügen" angezeigt. Wenn der Benutzer einen Ordner auswählt, verbleibt der Ordner an seinem ursprünglichen Speicherort auf dem Datenträger und wird zu einem Element in der StorageLibrary.Folders -Eigenschaft (und in der integrierten Fotos-App), aber der Ordner wird nicht als untergeordnetes Element des Ordners "Bilder" im Datei-Explorer angezeigt.

Windows.Storage.StorageFolder newFolder = await myPictures.RequestAddFolderAsync();

Entfernen eines Ordners aus einer Bibliothek

Rufen Sie zum Entfernen eines Ordners aus einer Bibliothek die StorageLibrary.RequestRemoveFolderAsync Methode auf, und geben Sie den zu entfernenden Ordner an. Sie können StorageLibrary.Folders und ein ListView-Steuerelement (oder ähnlich) verwenden, damit der Benutzer einen zu entfernenden Ordner auswählen kann.

Wenn Sie StorageLibrary.RequestRemoveFolderAsyncaufrufen, wird dem Benutzer ein Bestätigungsdialogfeld angezeigt, das besagt, dass der Ordner "in Bildern nicht mehr angezeigt wird, aber nicht gelöscht wird". Dies bedeutet, dass der Ordner an seinem ursprünglichen Speicherort auf dem Datenträger verbleibt, aus der StorageLibrary.Folders-Eigenschaft entfernt wird und nicht mehr in der integrierten Fotos-App enthalten ist.

Im folgenden Beispiel wird davon ausgegangen, dass der Benutzer den Ordner ausgewählt hat, der aus einem ListView Steuerelement namens lvPictureFoldersentfernt werden soll.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Erhalten von Benachrichtigungen über Änderungen an der Liste der Ordner in einer Bibliothek

Um über Änderungen an der Liste der Ordner in einer Bibliothek benachrichtigt zu werden, registrieren Sie einen Handler für das StorageLibrary.DefinitionChanged Ereignis der Bibliothek.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

void HandleDefinitionChanged(Windows.Storage.StorageLibrary sender, object args)
{
    // ...
}

Medienbibliotheksordner

Ein Gerät bietet fünf vordefinierte Speicherorte für Benutzer und Apps zum Speichern von Mediendateien. Integrierte Apps speichern sowohl vom Benutzer erstellte Medien als auch heruntergeladene Medien an diesen Speicherorten.

Die Standorte sind:

  • Ordner "Bilder". Enthält Bilder.

    • Ordner "Camera Roll". Enthält Fotos und Videos aus der integrierten Kamera.

    • Ordner "Gespeicherte Bilder". Enthält Bilder, die der Benutzer aus anderen Apps gespeichert hat.

  • Musik-Ordner. Enthält Songs, Podcasts und Hörbücher.

  • Ordner "Video". Enthält Videos.

Benutzer oder Apps können mediendateien auch außerhalb der Medienbibliotheksordner auf der SD-Karte speichern. Um eine Mediendatei zuverlässig auf der SD-Karte zu finden, scannen Sie den Inhalt der SD-Karte, oder bitten Sie den Benutzer, die Datei mithilfe einer Dateiauswahl zu finden. Weitere Informationen finden Sie unter Zugreifen auf die SD-Karte.

Medienbibliotheken abfragen

Um eine Sammlung von Dateien abzurufen, geben Sie die Bibliothek und den gewünschten Dateityp an.

using Windows.Storage;
using Windows.Storage.Search;

private async void getSongs()
{
    QueryOptions queryOption = new QueryOptions
        (CommonFileQuery.OrderByTitle, new string[] { ".mp3", ".mp4", ".wma" });

    queryOption.FolderDepth = FolderDepth.Deep;

    Queue<IStorageFolder> folders = new Queue<IStorageFolder>();

    var files = await KnownFolders.MusicLibrary.CreateFileQueryWithOptions
      (queryOption).GetFilesAsync();

    foreach (var file in files)
    {
        // do something with the music files
    }
}

Abfrageergebnisse umfassen sowohl internen als auch entfernbaren Speicher

Benutzer können dateien standardmäßig auf der optionalen SD-Karte speichern. Apps können jedoch die Speicherung von Dateien auf der SD-Karte deaktivieren. Daher können die Medienbibliotheken auf den internen Speicher des Geräts und die SD-Karte aufgeteilt werden.

Sie müssen keinen zusätzlichen Code schreiben, um diese Möglichkeit zu berücksichtigen. Die Methoden im Windows.Storage Namespace, die bekannte Ordner abfragen, kombinieren die Abfrageergebnisse aus beiden Speicherorten transparent. Sie müssen die Funktion removableStorage in der App-Manifestdatei auch nicht angeben, um diese kombinierten Ergebnisse zu erhalten.

Berücksichtigen Sie den Zustand des Gerätespeichers, der in der folgenden Abbildung angezeigt wird:

Bilder auf dem Smartphone und der SD-Karte

Wenn Sie den Inhalt der Bildbibliothek abfragen, indem Sie await KnownFolders.PicturesLibrary.GetFilesAsync()aufrufen, enthalten die Ergebnisse sowohl internalPic.jpg als auch SDPic.jpg.

Arbeiten mit Fotos

Auf Geräten, auf denen die Kamera sowohl ein Bild mit niedriger Auflösung als auch ein hochauflösendes Bild jedes Bilds speichert, geben die tiefen Abfragen nur das Bild mit niedriger Auflösung zurück.

Der Ordner „Eigene Aufnahmen“ und „Gespeicherte Bilder“ unterstützt die tiefen Abfragen nicht.

Ein Foto in der App öffnen, mit der es aufgenommen wurde

Wenn Sie es dem Benutzer ermöglichen möchten, ein Foto später in der App erneut zu öffnen, in der es aufgenommen wurde, können Sie die CreatorAppId- mit den Metadaten des Fotos speichern, indem Sie Code wie im folgenden Beispiel verwenden. In diesem Beispiel ist testPhoto eine StorageDatei.

IDictionary<string, object> propertiesToSave = new Dictionary<string, object>();

propertiesToSave.Add("System.CreatorOpenWithUIOptions", 1);
propertiesToSave.Add("System.CreatorAppId", appId);

testPhoto.Properties.SavePropertiesAsync(propertiesToSave).AsyncWait();   

Verwenden von Streammethoden zum Hinzufügen einer Datei zu einer Medienbibliothek

Wenn Sie mithilfe eines bekannten Ordners wie KnownFolders.PictureLibraryauf eine Medienbibliothek zugreifen und die Streammethoden verwenden, um eine Datei zur Medienbibliothek hinzuzufügen, müssen Sie sicherstellen, dass Sie alle Datenströme schließen, die Ihr Code öffnet. Andernfalls können diese Methoden die Datei der Medienbibliothek nicht wie erwartet hinzufügen, da mindestens ein Datenstrom immer noch über ein Handle für die Datei verfügt.

Wenn Sie beispielsweise den folgenden Code ausführen, wird die Datei nicht zur Medienbibliothek hinzugefügt. In der Codezeile using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)), sowohl die OpenAsync--Methode als auch die GetOutputStreamAt -Methode öffnen einen Datenstrom. Allerdings wird nur der von der GetOutputStreamAt Methode geöffnete Datenstrom als Ergebnis der mithilfe-Anweisung verworfen. Der andere Datenstrom bleibt geöffnet und verhindert, dass die Datei gespeichert wird.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");
using (var sourceStream = (await sourceFile.OpenReadAsync()).GetInputStreamAt(0))
{
    using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0))
    {
        await RandomAccessStream.CopyAndCloseAsync(sourceStream, destinationStream);
    }
}

Um Datenstrommethoden erfolgreich zum Hinzufügen einer Datei zur Medienbibliothek zu verwenden, müssen Sie alle Datenströme schließen, die vom Code geöffnet werden, wie im folgenden Beispiel gezeigt.

StorageFolder testFolder = await StorageFolder.GetFolderFromPathAsync(@"C:\test");
StorageFile sourceFile = await testFolder.GetFileAsync("TestImage.jpg");
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("MyTestImage.jpg");

using (var sourceStream = await sourceFile.OpenReadAsync())
{
    using (var sourceInputStream = sourceStream.GetInputStreamAt(0))
    {
        using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0))
            {
                await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);
            }
        }
    }
}