Fichiers et dossiers dans les bibliothèques de musique, d’images et de vidéos

Ajoutez les dossiers existants de musique, images ou vidéos dans les bibliothèques correspondantes. 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.

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. Par exemple, la bibliothèque d’images inclut le dossier connu d’images par défaut. 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.

Prérequis

  • Comprendre la programmation asynchrone pour les applications pour la plateforme Windows universelle (UWP)

    Pour apprendre à écrire des applications asynchrones en C# ou Visual Basic, voir Appeler des API asynchrones en C# ou Visual Basic. Pour apprendre à écrire des applications asynchrones en C++, voir Programmation asynchrone en C++.

  • Autorisations d’accès à l’emplacement

    Dans Visual Studio, ouvrez le fichier manifeste de l’application dans le concepteur du manifeste. Dans la page Fonctionnalités, sélectionnez les bibliothèques gérées par votre application.

    • Médiathèque
    • Bibliothèque d’images
    • Vidéothèque

    Pour en savoir plus, voir Autorisations d’accès aux fichiers.

Obtenir une référence à une bibliothèque

Notes

N’oubliez pas de déclarer la fonctionnalité appropriée. Pour plus d’informations, voir Déclarations des fonctionnalités d’application.  

Pour obtenir une référence à la bibliothèque Musique, Images ou Vidéo de l’utilisateur, appelez la méthode StorageLibrary.GetLibraryAsync. Indiquez la valeur correspondante de l’énumération KnownLibraryId.

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

Obtenir la liste des dossiers d’une bibliothèque

Pour obtenir la liste des dossiers d’une bibliothèque, obtenez la valeur de la propriété StorageLibrary.Folders.

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éfaut

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.

Windows.Storage.StorageFolder savePicturesFolder = myPictures.SaveFolder;

Ajouter un dossier existant à une bibliothèque

Pour ajouter un dossier à une bibliothèque, vous appelez la méthode 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. 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.

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

Supprimer un dossier d’une bibliothèque

Pour supprimer un dossier d’une bibliothèque, appelez la méthode StorageLibrary.RequestRemoveFolderAsync et spécifiez le dossier à supprimer. Vous pouvez utiliser StorageLibrary.Folders et un contrôle ListView (ou similaire) pour permettre à l’utilisateur de sélectionner un dossier à supprimer.

Lorsque vous appelez 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 qu’il ne sera pas supprimé. Cela signifie que le dossier est conservé à son emplacement d’origine sur le disque, qu’il est supprimé de la propriété StorageLibrary.Folders et qu’il n’est plus inclus dans l’application Photos intégrée.

L’exemple suivant suppose que l’utilisateur a sélectionné le dossier à supprimer d’un contrôle ListView nommé lvPictureFolders.

bool result = await myPictures.RequestRemoveFolderAsync(folder);

Recevoir des notifications de modifications apportées à la liste des dossiers d’une bibliothèque

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.

myPictures.DefinitionChanged += MyPictures_DefinitionChanged;

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

Dossiers de bibliothèque multimédia

Un appareil propose cinq emplacements prédéfinis aux utilisateurs et aux applications pour stocker des fichiers multimédias. 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.

Ces emplacements sont :

  • dossier Images. Contient des images.

    • Dossier Pellicule. Contient les photos et vidéos de l’appareil photo intégré.

    • Dossier Images enregistrées. Contient les images que l’utilisateur a enregistrées à partir d’autres applications.

  • Dossier Musique. Contient des chansons, des podcasts et des livres audio.

  • Dossier Vidéo. Contient des vidéos.

Les utilisateurs ou applications peuvent également stocker des fichiers multimédias en dehors des dossiers de bibliothèque multimédia sur la carte SD. 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. Pour plus d’informations, voir Accéder à la carte SD.

Interrogation des bibliothèques multimédias

Pour obtenir une collection de fichiers, spécifiez la bibliothèque et le type des fichiers souhaités.

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 amovible

Par défaut, les utilisateurs peuvent choisir de stocker les fichiers sur la carte SD en option. Les applications, en revanche, peuvent choisir de ne pas autoriser le stockage des fichiers sur la carte SD. Par conséquent, les bibliothèques multimédias peuvent se partager entre le stockage interne de l’appareil et la carte SD.

Il n’est pas nécessaire d’écrire d’autre code pour gérer cette possibilité. 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. 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.

Examinons l’état du stockage de l’appareil illustré dans l’image suivante :

images on the phone and sd card

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.

Utilisation de 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.

Les dossiers Pellicule et Images enregistrées ne prennent pas en charge les requêtes profondes.

Ouverture d’une photo dans l’application qui l’a capturée

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. Dans cet exemple, testPhoto est un 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édia

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. 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.

Par exemple, quand vous exécutez le code suivant, le fichier n’est pas ajouté à la bibliothèque multimédia. 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. En revanche, seul le flux ouvert par la méthode GetOutputStreamAt est supprimé à l’issue de l’instruction using. L’autre flux reste ouvert et empêche l’enregistrement du fichier.

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.

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