Les restrictions ont été considérablement renforcées pour le développement d’applications Windows 8. La raison principale est la protection de l’utilisateur. Cependant en tant que développeur WinForms et WPF, on se retrouve souvent à devoir trouver des alternatives pour mettre en place telle ou telle autre fonctionnalité. Un exemple est l’accès au système de fichiers ; comment doit-on procéder lorsqu’on décide de lire et/ou écrire un fichier ? A-t-on toujours le droit de faire ce genre d’opérations ?

Comme je l’ai dit, la protection de l’utilisateur est essentielle et il n’est pas question de laisser une application faire ce qu’elle veut sans avoir eu l’accord de l’utilisateur. Vous comprenez donc qu’il est tout à fait possible d’utiliser des contrôles comme des Folder ou File Picker car pour ce type d’action, on conscientise l’utilisateur en lui affichant une popup qui va lui permettre de comprendre que l’application désire lire ou écrire un fichier. Cela dit, ce n’est pas exactement à ce scénario que va répondre ce billet.

Le scénario auquel je pense est plutôt l’accès par l’application à un répertoire/fichier sans passer par une fenêtre de dialogue.

WinRT propose une série de classes donnant un accès direct à des répertoires sans devoir demander la permission de l’utilisateur. En revanche l’application devra déclarer qu’elle est capable de faire telle ou telle autre action.

Local App Data

Chaque application a son propre répertoire local dans lequel elle peut y stocker des fichiers. Ces répertoires sont protégés afin qu’une application ne puisse pas aller dans le répertoire local d’une autre application.

Attention, ce répertoire est supprimé lorsque l’application est désinstallée.

StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

StorageFile localFile = await localFolder.GetFileAsync(<span class="str">"localfile.txt"</span>);
<span class="kwrd">&lt;</span><span class="html">Image</span> <span class="attr">Source</span><span class="kwrd">="ms-appdata:///local/localfile.txt"</span><span class="kwrd">/&gt;</span>
Roaming App Data

Chaque application a aussi la possibilité de sauvegarder ses fichiers directement sur le cloud au travers de son Microsoft Account. Le but est donc de pouvoir accéder aux mêmes fichiers peu importe la machine sur laquelle nous nous trouvons.

La taille du répertoire étant limitée, il est aussi possible d’obtenir les informations de quota.

StorageFolder roamingFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;

StorageFile roamingFile = await roamingFolder.GetFileAsync(<span class="str">"roamingfile.txt"</span>);

<span class="kwrd">ulong</span> quota = ApplicationData.Current.RoamingStorageQuota;
<span class="kwrd">&lt;</span><span class="html">Image</span> <span class="attr">Source</span><span class="kwrd">="ms-appdata:///roaming/roamingfile.txt"</span><span class="kwrd">/&gt;</span>
Temporary App Data

Le répertoire temporaire de Windows peut être utilisé pour y stocker des informations.

Attention que cela reste le répertoire temporaire ; vos fichiers peuvent donc être supprimés automatiquement par le système ou lors d’un nettoyage de disque demandé par l’utilisateur.

StorageFolder tempFolder = Windows.Storage.ApplicationData.Current.TemporaryFolder;

StorageFile tempFile = await tempFolder.GetFileAsync(<span class="str">"tempfile.txt"</span>);
&lt;Image Source=<span class="str">"ms-appdata:///temp/tempfile.txt"</span>/&gt;
App Installed Location

Ce répertoire est l’endroit où l’application a été installée, il est donc possible d’accéder aux fichiers qui ont été packagés avec l’application.

StorageFolder installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;

StorageFile installedFile = await installFolder.GetFileAsync(<span class="str">"installedfile.txt"</span>);
<span class="kwrd">&lt;</span><span class="html">Image</span> <span class="attr">Source</span><span class="kwrd">="ms-appx:///installedfile.txt"</span><span class="kwrd">/&gt;</span>
Download Folder

Le répertoire destiné aux fichiers téléchargés est aussi disponible.

Attention qu’il n’est accessible qu’en écriture seule.

StorageFolder tempFolder = Windows.Storage.DownloadsFolder;
Documents Library

Vous pouvez accéder au répertoire des documents de l’utilisateur.

Pour cela, vous devrez cocher “Documents Library” dans les “Capabilities” du fichier manifeste (Package.appxmanifest) du projet. Vous devrez ensuite déclarer les extensions de fichiers que l’application pourra utiliser.

image

image

StorageFolder documentsFolder = Windows.Storage.KnownFolders.DocumentsLibrary;

StorageFile documentFile = await documentsFolder.GetFileAsync(<span class="str">"document.docx"</span>);
Music Library

Vous pouvez accéder au répertoire musique de l’utilisateur.

Pour cela, vous devrez cocher “Music Library” dans les “Capabilities” du fichier manifeste (Package.appxmanifest) du projet.

image

StorageFolder musicFolder = Windows.Storage.KnownFolders.MusicLibrary;

StorageFile musicFile = await musicFolder.GetFileAsync(<span class="str">"sample.mp3"</span>);
Pictures Library

Vous pouvez accéder au répertoire images de l’utilisateur.

Pour cela, vous devrez cocher “Pictures Library” dans les “Capabilities” du fichier manifeste (Package.appxmanifest) du projet.

image

StorageFolder picturesFolder = Windows.Storage.KnownFolders.PicturesLibrary;

StorageFile pictureFile = await picturesFolder.GetFileAsync(<span class="str">"sample.png"</span>);
Videos Library

Vous pouvez accéder au répertoire vidéo de l’utilisateur.

Pour cela, vous devrez cocher “Videos Library” dans les “Capabilities” du fichier manifeste (Package.appxmanifest) du projet.

image

StorageFolder videosFolder = Windows.Storage.KnownFolders.VideosLibrary;

StorageFile videoFile = await videosFolder.GetFileAsync(<span class="str">"sample.avi"</span>);
Removable Devices

Il est également possible d’accéder aux périphériques de stockage externes tels qu’une clé USB ou un disque dur externe.

Pour cela, vous devrez cocher “Videos Library” dans les “Capabilities” du fichier manifeste (Package.appxmanifest) du projet. Vous devrez ensuite déclarer les extensions de fichiers que l’application pourra utiliser.

image

StorageFolder removableDeviceFolder = Windows.Storage.KnownFolders.RemovableDevices;

StorageFile file = await removableDeviceFolder.GetFileAsync(<span class="str">"sample.txt"</span>);
Home Group

Vous pouvez accéder aux fichiers et répertoires partagés par d’autres ordinateurs dans un groupe résidentiel.

Il vous faudra activer au moins une des “capabilities” suivantes : Music, Pictures ou Videos. Il ne sera par contre pas possibles d’accéder aux documents même si la capacité est activée.

StorageFolder homeGroupFolder = Windows.Storage.KnownFolders.HomeGroup;

StorageFile file = await homeGroupFolder.GetFileAsync(<span class="str">"sample.png"</span>);
Media Server Devices

Enfin, il est aussi possible d’accéder aux fichiers et répertoires partagés par les serveurs multimédia sur un réseau.

Il vous faudra activer au moins une des “capabilities” suivantes : Music, Pictures ou Videos. Il ne sera par contre pas possibles d’accéder aux documents même si la capacité est activée.

StorageFolder mediaServerFolder = Windows.Storage.KnownFolders.MediaServerDevices;

StorageFile file = await mediaServerFolder.GetFileAsync(<span class="str">"sample.png"</span>);
Conclusion

Comme vous avez pu le constater, les api WinRT sont beaucoup plus restrictives que celles de .NET. La raison est avant de protéger l’utilisateur en lui proposant des applications de confiance. Au final, il est surtout important de connaître ses règles car vous arriverez toujours à faire vos opérations les plus courantes, seuls quelques cas particuliers devront être repensés.