WinRT – l’accès aux fichiers et la sérialisation

L’accès aux fichiers et le mode sécurisé de WinRT fut ma première surprise…Dans tous les exemples sur le NET, seul le LocalStorage est utilisé…et c’est compréhensible car c’est seulement dans les répertoires applicatifs que l’on peut d’accéder aux fichiers par code.

Pour les autres, il faut passer par un FilePicker qui vous fournit le StorageFile désiré – à travers une action utilisateur. Sinon la création d’un StorageFile à partir d’un chemin sous forme de chaine cause une exception…

Ensuite j’ai une la mauvaise surprise de la sérialisation XML…pufffftt ! Plus rien de ce que j’avais en NET ne fonctionne. J’ai donc fait quelques tentatives, pour me rendre compte que le support XML était loin de l’original.

Il n’y par exemple pas moyen de contrôler les attributs que  l’on veut sérialiser ou non. J’ai donc abandonner la piste [Xml…] au détriment de [DataContract] qui lui permet plus de chose.

Suite à cela en creusant encore un peu, j’ai découvert la FutureAccessList dans StorageApplicationPermissions qui permet de retrouver ses jetons et d’accéder à des répertoires ou fichiers sur lesquels l’utilisateur vous a précédemment donner des droits !

Vous trouverez ci-dessous un helper pour la gestion des fichiers avec les méthodes qui vous permette de faire tout cela.

   1: using System;

   2: using System.Collections.Generic;

   3: using System.Linq;

   4: using System.Text;

   5: using System.Threading.Tasks;

   6: using Windows.Storage;

   7: using Windows.Storage.AccessCache;

   8: using Windows.Storage.Pickers;

   9:  

  10: namespace CBR.WinRT.Core.Components

  11: {

  12:     sealed class FileHelper

  13:     {

  14:         static public async Task<bool> FileExistAsync(StorageFolder folder, string fileName)

  15:         {

  16:             try

  17:             {

  18:                 await folder.GetFileAsync(fileName);

  19:                 return true;

  20:             }

  21:             catch (System.IO.FileNotFoundException)

  22:             {

  23:                 System.Diagnostics.Debug.WriteLine("File doesn't exist. Use default.");

  24:                 return false;

  25:             }

  26:         }

  27:  

  28:         static public bool VerifyFileAccess(string filePath)

  29:         {

  30:             return StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == filePath).Count() != 0 ? true : false;

  31:         }

  32:  

  33:         static public void AddFileAccess(IStorageItem file)

  34:         {

  35:             if (file != null)

  36:             {

  37:                 //add to file access

  38:                 if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == file.Path).Count() == 0)

  39:                     StorageApplicationPermissions.FutureAccessList.Add(file, file.Path);

  40:             }

  41:         }

  42:  

  43:         static public async Task<StorageFile> GetFileAccess(string filePath)

  44:         {

  45:             if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == filePath).Count() != 0)

  46:             {

  47:                 var token = StorageApplicationPermissions.FutureAccessList.Entries.Single(p => p.Metadata == filePath).Token;

  48:                 return await StorageApplicationPermissions.FutureAccessList.GetFileAsync(token);

  49:             }

  50:             else

  51:                 return null;

  52:         }

  53:  

  54:         static public async Task<StorageFolder> GetFolderAccess(string folderPath)

  55:         {

  56:             if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == folderPath).Count() != 0)

  57:             {

  58:                 var token = StorageApplicationPermissions.FutureAccessList.Entries.Single(p => p.Metadata == folderPath).Token;

  59:                 return await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token);

  60:             }

  61:             else

  62:                 return null;

  63:         }

  64:  

  65:         static public async Task<StorageFile> CBRPickSingleFile()

  66:         {

  67:             List<string> filters = new List<string>() { ".cbz", ".cbr", ".zip", ".rar" };

  68:             

  69:             return await PickSingleFile( PickerViewMode.List, filters );

  70:         }

  71:  

  72:         static public async Task<StorageFile> PickSingleFile(PickerViewMode mode, IList<string> filters)

  73:         {

  74:             var picker = new FileOpenPicker();

  75:             picker.ViewMode = mode;

  76:             foreach (string filter in filters)

  77:                 picker.FileTypeFilter.Add(filter);

  78:  

  79:             var file = await picker.PickSingleFileAsync();

  80:             if (file != null)

  81:             {

  82:                 //add to file access

  83:                 if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == file.Path).Count() == 0)

  84:                     StorageApplicationPermissions.FutureAccessList.Add(file, file.Path);

  85:  

  86:                 return file;

  87:             }

  88:             else return null;

  89:         }

  90:  

  91:         static public async Task<StorageFile> CBRPickMultipleFiles()

  92:         {

  93:             List<string> filters = new List<string>() { ".cbz", ".cbr", ".zip", ".rar" };

  94:  

  95:             return await PickSingleFile(PickerViewMode.List, filters);

  96:         }

  97:  

  98:         static public async Task<IReadOnlyList<StorageFile>> PickMultipleFiles(PickerViewMode mode, IList<string> filters)

  99:         {

 100:             var picker = new FileOpenPicker();

 101:             picker.ViewMode = mode;

 102:             foreach (string filter in filters)

 103:                 picker.FileTypeFilter.Add(filter);

 104:  

 105:             var files = await picker.PickMultipleFilesAsync();

 106:             if (files != null)

 107:             {

 108:                 //add to file access

 109:                 foreach (StorageFile item in files)

 110:                 {

 111:                     if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == item.Path).Count() == 0)

 112:                         StorageApplicationPermissions.FutureAccessList.Add(item, item.Path);

 113:                 }

 114:                 return files;

 115:             }

 116:             else return null;

 117:         }

 118:  

 119:         static public async Task<StorageFolder> CBRPickSingleFolder()

 120:         {

 121:             List<string> filters = new List<string>() { ".cbz", ".cbr", ".zip", ".rar" };

 122:  

 123:             return await PickSingleFolder(PickerViewMode.List, filters);

 124:         }

 125:  

 126:         static public async Task<StorageFolder> PickSingleFolder(PickerViewMode mode, IList<string> filters)

 127:         {

 128:             var picker = new FolderPicker();

 129:             picker.ViewMode = mode;

 130:             foreach (string filter in filters)

 131:                 picker.FileTypeFilter.Add(filter);

 132:  

 133:             var folder = await picker.PickSingleFolderAsync();

 134:             if (folder != null)

 135:             {

 136:                 //add to access

 137:                 if (StorageApplicationPermissions.FutureAccessList.Entries.Where(p => p.Metadata == folder.Path).Count() == 0)

 138:                         StorageApplicationPermissions.FutureAccessList.Add(folder, folder.Path);

 139:                 return folder;

 140:             }

 141:             else return null;

 142:         }

 143:     }

 144: }

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s