Fichiers et dossiers dans les bibliothèques de musique, d’images et de vidéosFiles and folders in the Music, Pictures, and Videos libraries

Ajoutez les dossiers existants de musique, images ou vidéos dans les bibliothèques correspondantes.Add existing folders of music, pictures, or videos to the corresponding libraries. Vous pouvez également supprimer des dossiers de bibliothèques, obtenir la liste des dossiers d’une bibliothèque et découvrir des photos, de la musique et des vidéos.You can also remove folders from libraries, get the list of folders in a library, and discover stored photos, music, and videos.

Une bibliothèque est une collection virtuelle de dossiers, qui comprend un dossier connu par défaut, ainsi que d’autres dossiers que l’utilisateur a ajouté à la bibliothèque à l’aide de votre application ou d’une des applications intégrées.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. Par exemple, la bibliothèque d’images inclut le dossier connu d’images par défaut.For example, the Pictures library includes the Pictures known folder by default. L’utilisateur peut ajouter ou supprimer des dossiers dans la bibliothèque d’images à l’aide de votre application ou de l’application Photos intégrée.The user can add folders to, or remove them from, the Pictures library by using your app or the built-in Photos app.

PrérequisPrerequisites

  • Comprendre la programmation asynchrone pour les applications pour la plateforme Windows universelle (UWP)Understand async programming for Universal Windows Platform (UWP) apps

    Pour apprendre à écrire des applications asynchrones en C# ou Visual Basic, voir Appeler des API asynchrones en C# ou Visual Basic.You can learn how to write asynchronous apps in C# or Visual Basic, see Call asynchronous APIs in C# or Visual Basic. Pour apprendre à écrire des applications asynchrones en C++, voir Programmation asynchrone en C++.To learn how to write asynchronous apps in C++, see Asynchronous programming in C++.

  • Autorisations d'accès à l'emplacementAccess permissions to the location

    Dans Visual Studio, ouvrez le fichier manifeste de l’application dans le concepteur du manifeste.In Visual Studio, open the app manifest file in Manifest Designer. Dans la page Fonctionnalités, sélectionnez les bibliothèques gérées par votre application.On the Capabilities page, select the libraries that your app manages.

    • MédiathèqueMusic Library
    • Bibliothèque d’imagesPictures Library
    • VidéothèqueVideos Library

    Pour en savoir plus, voir Autorisations d’accès aux fichiers.To learn more, see File access permissions.

Obtenir une référence à une bibliothèqueGet a reference to a library

Notes

N’oubliez pas de déclarer la fonctionnalité appropriée.Remember to declare the appropriate capability. Pour plus d’informations, voir Déclarations des fonctionnalités d’application.See App capability declarations for more information.  

Pour obtenir une référence à la bibliothèque Musique, Images ou Vidéo de l’utilisateur, appelez la méthode StorageLibrary.GetLibraryAsync.To get a reference to the user's Music, Pictures, or Video library, call the StorageLibrary.GetLibraryAsync method. Indiquez la valeur correspondante de l’énumération KnownLibraryId.Provide the corresponding value from the KnownLibraryId enumeration.

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

Obtenir la liste des dossiers d’une bibliothèqueGet the list of folders in a library

Pour obtenir la liste des dossiers d’une bibliothèque, obtenez la valeur de la propriété StorageLibrary.Folders.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;

Obtenir le dossier contenu dans une bibliothèque où les nouveaux fichiers sont enregistrés par défautGet the folder in a library where new files are saved by default

Pour obtenir le dossier d’une bibliothèque où les nouveaux fichiers sont enregistrés par défaut, obtenez la valeur de la propriété StorageLibrary.SaveFolder.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;

Ajouter un dossier existant à une bibliothèqueAdd an existing folder to a library

Pour ajouter un dossier à une bibliothèque, vous appelez la méthode StorageLibrary.RequestAddFolderAsync.To add a folder to a library, you call the StorageLibrary.RequestAddFolderAsync. En prenant l’exemple de la bibliothèque Images, l’appel de cette méthode entraîne l’affichage d’un sélecteur de dossiers avec un bouton Ajouter ce dossier à Images.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. Si l’utilisateur sélectionne un dossier, celui-ci reste à son emplacement d’origine sur le disque et devient un élément dans la propriété StorageLibrary.Folders (et dans l’application Photos intégrée), mais le dossier n’apparaît pas en tant qu’enfant du dossier Images dans l’Explorateur de fichiers.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();

Supprimer un dossier d’une bibliothèqueRemove a folder from a library

Pour supprimer un dossier d’une bibliothèque, appelez la méthode StorageLibrary.RequestRemoveFolderAsync et spécifiez le dossier à supprimer.To remove a folder from a library, call the StorageLibrary.RequestRemoveFolderAsync method and specify the folder to be removed. Vous pouvez utiliser StorageLibrary.Folders et un contrôle ListView (ou similaire) pour permettre à l’utilisateur de sélectionner un dossier à supprimer.You could use StorageLibrary.Folders and a ListView control (or similar) for the user to select a folder to remove.

Lorsque vous appelez la méthode StorageLibrary.RequestRemoveFolderAsync, l’utilisateur voit une boîte de dialogue de confirmation indiquant que le dossier n’apparaîtra plus dans le dossier Images, mais ne sera pas supprimé.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." Cela signifie que le dossier reste dans son emplacement d’origine sur le disque, est supprimé de la propriété StorageLibrary.Folders et n’est plus inclus dans l’application Photos intégrée.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.

L’exemple suivant suppose que l’utilisateur a sélectionné le dossier à supprimer d’un contrôle ListView nommé lvPictureFolders.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);

Recevoir des notifications de modifications apportées à la liste des dossiers d’une bibliothèqueGet notified of changes to the list of folders in a library

Pour être averti des modifications apportées à la liste des dossiers d’une bibliothèque, inscrivez un gestionnaire pour l’événement StorageLibrary.DefinitionChanged de la bibliothèque.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)
{
    // ...
}

Dossiers de bibliothèque multimédiaMedia library folders

Un appareil propose cinq emplacements prédéfinis aux utilisateurs et aux applications pour stocker des fichiers multimédias.A device provides five predefined locations for users and apps to store media files. Les applications intégrées stockent à la fois les médias créés par l’utilisateur et les médias téléchargés à ces emplacements.Built-in apps store both user-created media and downloaded media in these locations.

Ces emplacements sont :The locations are:

  • dossier Images.Pictures folder. Contient des images.Contains pictures.

    • Dossier Pellicule.Camera Roll folder. Contient les photos et vidéos de l’appareil photo intégré.Contains photos and video from the built-in camera.

    • Dossier Images enregistrées.Saved Pictures folder. Contient les images que l’utilisateur a enregistrées à partir d’autres applications.Contains pictures that the user has saved from other apps.

  • Dossier Musique.Music folder. Contient des chansons, des podcasts et des livres audio.Contains songs, podcasts, and audio books.

  • Dossier Vidéo.Video folder. Contient des vidéos.Contains videos.

Les utilisateurs ou applications peuvent également stocker des fichiers multimédias en dehors des dossiers de bibliothèque multimédia sur la carte SD.Users or apps may also store media files outside the media library folders on the SD card. Pour trouver un fichier multimédia de manière fiable sur la carte SD, analysez le contenu de la carte SD ou demandez à l’utilisateur de localiser le fichier à l’aide d’un sélecteur de fichiers.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. Pour plus d’informations, voir Accéder à la carte SD.For more info, see Access the SD card.

Interrogation des bibliothèques multimédiasQuerying the media libraries

Pour obtenir une collection de fichiers, spécifiez la bibliothèque et le type des fichiers souhaités.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
    }
}

Les résultats de requête incluent à la fois le stockage interne et amovibleQuery results include both internal and removable storage

Par défaut, les utilisateurs peuvent choisir de stocker les fichiers sur la carte SD en option.Users can choose to store files by default on the optional SD card. Les applications, en revanche, peuvent choisir de ne pas autoriser le stockage des fichiers sur la carte SD.Apps, however, can opt out of allowing files to be stored on the SD card. Par conséquent, les bibliothèques multimédias peuvent se partager entre le stockage interne de l’appareil et la carte SD.As a result, the media libraries can be split across the device's internal storage and the SD card.

Il n’est pas nécessaire d’écrire d’autre code pour gérer cette possibilité.You don't have to write additional code to handle this possibility. Les méthodes de l’espace de noms Windows.Storage qui interrogent les dossiers connus combinent en toute transparence les résultats de requête issus de ces deux emplacements.The methods in the Windows.Storage namespace that query known folders transparently combine the query results from both locations. De même, vous n’avez pas à spécifier la fonctionnalité removableStorage dans le fichier manifeste de l’application pour obtenir ces résultats combinés.You don't have to specify the removableStorage capability in the app manifest file to get these combined results, either.

Examinons l’état du stockage de l’appareil illustré dans l’image suivante :Consider the state of the device's storage shown in the following image:

Images sur le téléphone et la carte SD

Si vous interrogez le contenu de la bibliothèque d’images en appelant await KnownFolders.PicturesLibrary.GetFilesAsync(), les résultats incluent à la fois internalPic.jpg et SDPic.jpg.If you query the contents of the Pictures Library by calling await KnownFolders.PicturesLibrary.GetFilesAsync(), the results include both internalPic.jpg and SDPic.jpg.

Utilisation de photosWorking with photos

Sur les périphériques où l’appareil photo enregistre à la fois une image basse résolution et une image haute résolution de chaque photo, les requêtes profondes retournent uniquement l’image basse résolution.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.

Les dossiers Pellicule et Images enregistrées ne prennent pas en charge les requêtes profondes.The Camera Roll and the Saved Pictures folder do not support the deep queries.

Ouverture d’une photo dans l’application qui l’a capturéeOpening a photo in the app that captured it

Si vous voulez laisser l’utilisateur rouvrir une photo dans l’application qui l’a capturée, vous pouvez enregistrer le CreatorAppId avec les métadonnées de la photo en utilisant du code similaire à celui de l’exemple suivant.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. Dans cet exemple, testPhoto est un 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();   

Utilisation de méthodes de flux pour ajouter un fichier à une bibliothèque multimédiaUsing stream methods to add a file to a media library

Quand vous accédez à une bibliothèque multimédia à l’aide d’un dossier connu comme KnownFolders.PictureLibrary et que vous utilisez des méthodes de flux pour y ajouter un fichier, veillez à fermer tous les flux que votre code ouvre.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. Sinon, ces méthodes ne parviennent pas à ajouter le fichier à la bibliothèque multimédia comme prévu car au moins un flux possède toujours un handle vers le fichier.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.

Par exemple, quand vous exécutez le code suivant, le fichier n’est pas ajouté à la bibliothèque multimédia.For example, when you run the following code, the file is not added to the media library. Dans la ligne de code, using (var destinationStream = (await destinationFile.OpenAsync(FileAccessMode.ReadWrite)).GetOutputStreamAt(0)), les méthodes OpenAsync et GetOutputStreamAt ouvrent toutes les deux un flux.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. En revanche, seul le flux ouvert par la méthode GetOutputStreamAt est supprimé à l’issue de l’instruction using.However only the stream opened by the GetOutputStreamAt method is disposed as a result of the using statement. L’autre flux reste ouvert et empêche l’enregistrement du fichier.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);
    }
}

Pour bien utiliser des méthodes de flux pour ajouter un fichier à la bibliothèque multimédia, veillez à fermer tous les flux que votre code ouvre, comme illustré dans l’exemple suivant.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);
            }
        }
    }
}