Dateien und Ordner in den Musik-, Bild- und VideobibliothekenFiles and folders in the Music, Pictures, and Videos libraries

Fügen Sie vorhandene Musik-, Bilder- oder Video-Ordner den entsprechenden Bibliotheken hinzu.Add existing folders of music, pictures, or videos to the corresponding libraries. Sie können auch Ordner aus Bibliotheken entfernen, die Liste der Ordner in einer Bibliothek abrufen und gespeicherte Fotos, Musik und Videos untersuchen.You can also remove folders from libraries, get the list of folders in a library, and discover stored photos, music, and videos.

Eine Bibliothek ist eine virtuelle Sammlung von Ordnern, die standardmäßig einen bekannten Ordner sowie alle anderen Ordner enthält, die der Benutzer mithilfe Ihrer App oder einer der integrierten Apps zur Bibliothek hinzugefügt hat.A library is a virtual collection of folders, which includes a known folder by default plus any other folders the user has added to the library by using your app or one of the built-in apps. Die Bildbibliothek enthält z. B. standardmäßig den bekannten Ordner „Bilder“.For example, the Pictures library includes the Pictures known folder by default. Der Benutzer kann mithilfe Ihrer App oder der integrierten Fotos-App Ordner zur Bildbibliothek hinzufügen oder aus ihr entfernen.The user can add folders to, or remove them from, the Pictures library by using your app or the built-in Photos app.

VoraussetzungenPrerequisites

  • Kenntnisse in der asynchronen Programmierung für Apps für die universelle Windows-Plattform (UWP)Understand async programming for Universal Windows Platform (UWP) apps

    Informationen zum Schreiben von asynchronen Apps in C# oder Visual Basic finden Sie unter Aufrufen asynchroner APIs in C# oder Visual Basic.You can learn how to write asynchronous apps in C# or Visual Basic, see Call asynchronous APIs in C# or Visual Basic. Informationen zum Schreiben von asynchronen Apps in C++ finden Sie unter Asynchrone Programmierung in C++.To learn how to write asynchronous apps in C++, see Asynchronous programming in C++.

  • Zugriffsberechtigungen für den SpeicherortAccess permissions to the location

    Öffnen Sie die App-Manifestdatei im Manifest-Designer in Visual Studio.In Visual Studio, open the app manifest file in Manifest Designer. Wählen Sie auf der Seite Funktionen die Bibliotheken aus, die Ihre App verwaltet.On the Capabilities page, select the libraries that your app manages.

    • MusikbibliothekMusic Library
    • BildbibliothekPictures Library
    • VideobibliothekVideos Library

    Weitere Informationen finden Sie unter Berechtigungen für den Dateizugriff.To learn more, see File access permissions.

Abrufen eines Verweises auf eine BibliothekGet a reference to a library

Hinweis

Denken Sie daran, die entsprechende Funktion zu deklarieren.Remember to declare the appropriate capability. Weitere Informationen finden Sie unter Deklarationen von App-Funktionen.See App capability declarations for more information.  

Rufen Sie die StorageLibrary.GetLibraryAsync-Methode auf, um einen Verweis auf die Musik-, Bild- oder Videobibliothek des Benutzers zu erhalten.To get a reference to the user's Music, Pictures, or Video library, call the StorageLibrary.GetLibraryAsync method. Geben Sie den entsprechenden Wert der KnownLibraryId-Enumeration ein.Provide the corresponding value from the KnownLibraryId enumeration.

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

Abrufen der Liste der Ordner in einer BibliothekGet the list of folders in a library

Um die Liste der Ordner in einer Bibliothek abzurufen, rufen den Wert der StorageLibrary.Folders-Eigenschaft ab.To get the list of folders in a library, get the value of the StorageLibrary.Folders property.

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

Abrufen des Ordners in einer Bibliothek, in den neue Dateien standardmäßig gespeichert werdenGet the folder in a library where new files are saved by default

Um den Ordner in einer Bibliothek abzurufen, in den neue Dateien standardmäßig gespeichert werden, rufen Sie den Wert der StorageLibrary.SaveFolder-Eigenschaft ab.To get the folder in a library where new files are saved by default, get the value of the StorageLibrary.SaveFolder property.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Hinzufügen eines vorhandenen Ordners zu einer BibliothekAdd an existing folder to a library

Um einen Ordner zu einer Bibliothek hinzuzufügen, rufen Sie StorageLibrary.RequestAddFolderAsync auf.To add a folder to a library, you call the StorageLibrary.RequestAddFolderAsync. Das Aufrufen dieser Methode führt beispielsweise bei der Bildbibliothek zur Anzeige einer Ordnerauswahl für den Benutzer, die die Schaltfläche zum Hinzufügen dieses Ordners zu Bildern umfasst.Taking the Pictures Library as an example, calling this method causes a folder picker to be shown to the user with an Add this folder to Pictures button. Wenn der Benutzer einen Ordner auswählt, dann verbleibt er am ursprünglichen Speicherort auf dem Datenträger und wird zu einem Element in der StorageLibrary.Folders-Eigenschaft (und in der integrierten Fotos-App). Der Ordner wird aber nicht im Datei-Explorer als untergeordnetes Element des Ordners „Bilder“ angezeigt.If the user picks a folder then the folder remains in its original location on disk and it becomes an item in the StorageLibrary.Folders property (and in the built-in Photos app), but the folder does not appear as a child of the Pictures folder in File Explorer.

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

Entfernen eines Ordners aus einer BibliothekRemove a folder from a library

Rufen Sie zum Entfernen eines Ordners aus einer Bibliothek die StorageLibrary.RequestRemoveFolderAsync-Methode auf, und geben Sie den zu entfernenden Ordner an.To remove a folder from a library, call the StorageLibrary.RequestRemoveFolderAsync method and specify the folder to be removed. Sie können StorageLibrary.Folders und ein ListView-Steuerelement (oder ähnliches) verwenden, damit der Benutzer einen zu entfernenden Ordner auswählen kann.You could use StorageLibrary.Folders and a ListView control (or similar) for the user to select a folder to remove.

Wenn Sie StorageLibrary.RequestRemoveFolderAsync aufrufen, wird dem Benutzer ein Bestätigungsdialogfeld angezeigt, das darüber informiert, dass der Ordner nicht länger unter „Bilder“ angezeigt, aber auch nicht gelöscht wird.When you call StorageLibrary.RequestRemoveFolderAsync, the user sees a confirmation dialog saying that the folder "won't appear in Pictures anymore, but won't be deleted." Dies bedeutet, dass der Ordner am ursprünglichen Speicherort auf dem Datenträger verbleibt, aus der StorageLibrary.Folders-Eigenschaft entfernt wird und nicht länger in der integrierten Fotos-App enthalten ist.What this means is that the folder remains in its original location on disk, is removed from the StorageLibrary.Folders property, and will no longer included in the built-in Photos app.

Im folgenden Beispiel wird davon ausgegangen, dass der Benutzer den zu entfernenden Ordner aus einem ListView-Steuerelement namens lvPictureFolders ausgewählt hat.The following example assumes that the user has selected the folder to remove from a ListView control named lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Empfangen von Benachrichtigungen über Änderungen an der Liste der Ordner in einer BibliothekGet notified of changes to the list of folders in a library

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.To get notified about changes to the list of folders in a library, register a handler for the StorageLibrary.DefinitionChanged event of the library.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

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

MedienbibliothekordnerMedia library folders

Ein Gerät bietet fünf vordefinierte Speicherorte, an denen Benutzer und Apps Mediendateien speichern können.A device provides five predefined locations for users and apps to store media files. Vorinstallierte Apps speichern an diesen Speicherorten sowohl von Benutzern erstellte Medien als auch heruntergeladene Medien.Built-in apps store both user-created media and downloaded media in these locations.

Die Speicherorte lauten:The locations are:

  • Ordner BilderPictures folder. Enthält Bilder.Contains pictures.

    • Ordner Eigene AufnahmenCamera Roll folder. Enthält Fotos und Videos, die mit der integrierten Kamera aufgenommen wurden.Contains photos and video from the built-in camera.

    • Ordner Gespeicherte Bilder.Saved Pictures folder. Enthält Bilder, die der Benutzer aus anderen Apps gespeichert hat.Contains pictures that the user has saved from other apps.

  • Ordner Musik.Music folder. Enthält Songs, Podcasts und Hörbücher.Contains songs, podcasts, and audio books.

  • Ordner Video.Video folder. Enthält Videos.Contains videos.

Mediendateien können von Benutzern und Apps auch außerhalb der Medienbibliothekordner auf der SD-Karte gespeichert werden.Users or apps may also store media files outside the media library folders on the SD card. Durchsuchen Sie den Inhalt der SD-Karte, um eine Mediendatei auf der SD-Karte auf zuverlässige Weise zu finden, oder bitten Sie den Benutzer, mithilfe einer Dateiauswahl auf die Datei zuzugreifen.To find a media file reliably on the SD card, scan the contents of the SD card, or ask the user to locate the file by using a file picker. Weitere Informationen finden Sie unter Zugreifen auf die SD-Karte.For more info, see Access the SD card.

Abfragen der MedienbibliothekenQuerying the media libraries

Um eine Sammlung von Dateien zu erhalten, geben Sie die Bibliothek und den Typ der gewünschten Dateien an.To get a collection of files, specify the library and the type of files that you want.

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 Speicher als auch WechselmedienQuery results include both internal and removable storage

Benutzer können angeben, dass Dateien standardmäßig auf der optionalen SD-Karte gespeichert werden sollen.Users can choose to store files by default on the optional SD card. Für Apps kann festgelegt werden, dass Dateien nicht auf der SD-Karte gespeichert werden sollen.Apps, however, can opt out of allowing files to be stored on the SD card. Daher können die Medienbibliotheken auf den internen Speicher und die SD-Karte des Geräts aufgeteilt werden.As a result, the media libraries can be split across the device's internal storage and the SD card.

Sie müssen keinen zusätzlichen Code schreiben, um diese Möglichkeit bereitzustellen.You don't have to write additional code to handle this possibility. In den Methoden im Windows.Storage-Namespace, mit denen bekannte Ordner abgefragt werden, sind die Abfrageergebnisse beider Speicherorte transparent kombiniert.The methods in the Windows.Storage namespace that query known folders transparently combine the query results from both locations. Sie müssen die removableStorage-Funktion in der App-Manifestdatei nicht angeben, um diese kombinierten Ergebnisse zu erhalten.You don't have to specify the removableStorage capability in the app manifest file to get these combined results, either.

Beachten Sie den Status des Gerätespeichers, der in der folgenden Abbildung dargestellt ist:Consider the state of the device's storage shown in the following image:

Bilder auf dem Smartphone und der SD-Karte

Wenn Sie den Inhalt der Bildbibliothek abfragen, indem Sie await KnownFolders.PicturesLibrary.GetFilesAsync() aufrufen, ist sowohl „internalPic.jpg“ als auch „SDPic.jpg“ in den Ergebnissen enthalten.If you query the contents of the Pictures Library by calling await KnownFolders.PicturesLibrary.GetFilesAsync(), the results include both internalPic.jpg and SDPic.jpg.

Verwenden von FotosWorking with photos

Auf Geräten, auf denen jedes Bild von der Kamera sowohl in niedriger als auch in hoher Auflösung gespeichert wird, wird bei tiefen Abfragen nur das Bild mit niedriger Auflösung zurückgegeben.On devices where the camera saves both a low-resolution image and a high-resolution image of every picture, the deep queries return only the low-resolution image.

Für die Ordner „Eigene Aufnahmen“ und „Gespeicherte Bilder“ werden keine tiefen Abfragen unterstützt.The Camera Roll and the Saved Pictures folder do not support the deep queries.

Öffnen eines Fotos in der App, mit der es aufgenommen wurdeOpening a photo in the app that captured it

Wenn Sie es Benutzern ermöglichen möchten, ein Foto später erneut in der App zu öffnen, mit der es aufgenommen wurde, können Sie die CreatorAppId mit den Metadaten des Fotos speichern. Verwenden Sie hierzu ähnlichen Code wie im folgenden Beispiel.If you want to let the user open a photo again later in the app that captured it, you can save the CreatorAppId with the photo's metadata by using code similar to the following example. In diesem Beispiel ist testPhoto eine StorageFile.In this example, testPhoto is a StorageFile.

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 Datenstrommethoden zum Hinzufügen einer Datei zur MedienbibliothekUsing stream methods to add a file to a media library

Wenn Sie auf eine Medienbibliothek zugreifen, indem Sie einen bekannten Ordner wie KnownFolders.PictureLibrary verwenden, und der Medienbibliothek mithilfe von Datenstrommethoden eine Datei hinzufügen, müssen Sie darauf achten, alle von Ihrem Code geöffneten Datenströme wieder zu schließen.When you access a media library by using a known folder such as KnownFolders.PictureLibrary, and you use stream methods to add a file to the media library, you have to make sure to close all the streams that your code opens. Andernfalls wird die Datei der Medienbibliothek mit diesen Methoden nicht wie erwartet hinzugefügt, weil mindestens ein Stream weiterhin über einen Handle für die Datei verfügt.Otherwise these methods fail to add the file to the media library as expected because at least one stream still has a handle to the file.

Wenn Sie beispielsweise den folgenden Code ausführen, wird die Datei nicht der Medienbibliothek hinzugefügt.For example, when you run the following code, the file is not added to the media library. In der Codezeile using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)) wird sowohl mit der OpenAsync-Methode als auch mit der GetOutputStreamAt-Methode ein Datenstrom geöffnet.In the line of code, using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)), both the OpenAsync method and the GetOutputStreamAt method open a stream. Es wird aber nur der mit der GetOutputStreamAt-Methode geöffnete Datenstrom aufgrund der using-Anweisung wieder geschlossen.However only the stream opened by the GetOutputStreamAt method is disposed as a result of the using statement. Der andere Datenstrom bleibt geöffnet und verhindert das Speichern der Datei.The other stream remains open and prevents saving the file.

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 Streammethoden erfolgreich zum Hinzufügen einer Datei zur Medienbibliothek zu verwenden, müssen Sie alle Datenströme schließen, die von Ihrem Code geöffnet werden. Dies ist im folgenden Beispiel dargestellt.To use stream methods successfully to add a file to the media library, make sure to close all the streams that your code opens, as shown in the following example.

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