Windows 8 a Windows Phone 8.1 mají z důvodu maximalizace bezpečnosti velmi omezené API na přístup k souborům. Po nastavení některých Capabilities aplikace v jejím manifestu můžete sice přistupovat k několika základním pseudo-složkám - tedy knihovnám Obrázky, Hudba a Videa (plus enterprise aplikace na Windows 8 k Dokumentům), ale přístup k dalším složkám a souborům je již komplikovaný. Na záchranu ale přichází třída StorageApplicationPermissions .
K čemu to je dobré?
Třída StorageApplicationPermissions obsahuje dvě užitečné vlastnosti: FutureAccessList a MostRecentlyUsedList . První z nich umožňuje "uložit" soubor či složku, ke které již jste získali přístup (např. díky svolení uživatele přes FileOpenPicker a FolderPicker) a vygenerovat pro ni unikátní klíč, kterým danou položku můžete kdykoliv v budoucnosti znovu získat. Takto dostáváte opravdu časově neomezený přístup a to až k 1 000 různým souborům a složkám s tím, že je však nutné se o tento seznam starat a nepoužívané záznamy ručně mazat. MostRecentlyUsedList funguje na úplně stejném principu, ale je limitován na 25 položek, o které se však plně stará (dokonce i automaticky udržuje odkaz ve chvíli, kdy se poloha odkazovaného souboru změní - např. přesunutím na jiné místo na disku). Po překročení limitu 25 souborů nejstarší přidanou smaže ze seznamu.
Jak na to?
Je to velmi jednoduché! Ukážeme si to na příkladu FutureAccessList , pro seznam naposledy použitých je vše identické. Pro přidání nového souboru nebo složky zavoláme metodu Add :
string token = StorageApplicationPermissions.FutureAccessList.Add(file, metadata);
Prvním parametrem je ukládaná složka nebo soubor a druhým, nepovinným parametrem je string s doplňujícími informacemi pro vaši potřebu. Důležitý krok, který nyní musíte provést, je uložit si získaný string token do nějakého persistentního úložiště - např. do souboru nebo do databáze. Právě přes tento token můžete soubor ze seznamu znovu získat:
IStorageItem item = await StorageApplicationPermissions.FutureAccessList.GetItemAsync( token );
Vrácený objekt je typu IStorageItem , který můžete přetypovat na StorageFolder nebo StorageFile dle potřeby. Pro zrychlení celého procesu můžete také použít přímo metody GetFileAsync nebo GetFolderAsync , které vrací právě tyto konkrétní typy. A jak již z názvů metod je vidět, vše probíhá přes moderní asynchronní syntaxi. Důležité upozornění - stejně jako většina ostatních metod, které ve WinRT pracují se soubory je i v tomto případě nutné obalit volání Get metod blokem try-catch , protože v případě, že v seznamu není nalezen zadaný token, je vyhozena běhová výjimka.