[UWP] Accesso alla SD da un’app Windows 10
In giro per il web troverete tonnellate di documentazione relativa all’accesso alla SD da un’applicazione UWP. Ci sono certe cose che non mi entrano in testa, per cui mi appunto qui un po’ di cosucce interessanti.
- La chiamata a:
var folder = KnownFolders.RemovableDevices;
è la porta di accesso per ottenere un riferimento alla SD - E’ necessario attivare la capability “Removable Storage”, altrimenti la riga sui sopra vi spara una bella System.UnauthorizedAccessException
- Se tutto è andato bene, otterrete un oggetto simile al seguente:
- Come si può notare, non è la vera root della vostra SD. Per ottenere la root dell’SD dovete nuovamente richiedere l’elenco dei folder:
var root = await folder.GetFoldersAsync().FirstOrDefault();
- L’oggetto root potrebbe valere null nel caso in cui non sia presente alcuna SD nel dispositivo Windows 10. L’oggetto folder invece è sempre valorizzato, indipendentemente dal fatto che la SD sia presente oppure no
- Su un PC Desktop, i dischi USB ed un eventuale lettore CD/DVD vengono visti come “Removable Storage”. In questo caso, la proprietà Name di StorageFolder vi dà la lettera del drive (esempio: “E:”).
- Da notare che potreste avere più root SD, semplicemente per il fatto che avete più dischi removibili presenti nel sistema, e quindi avete una root per ciascun drive.
- E’ necessario andare nel file di manifest, nella sezione “Declarations”, ed aggiungere tante voci “File Type Associations”, una per ciascun tipo di file che volete leggere/scrivere dalla scheda SD. Volete leggere i file .txt? Dovete specificarlo! Volete leggere i file .pdf? Idem come sopra!
- Se non indicate alcun “File Type Associations” nel file di manifest, qualsiasi tentativo di lettura/scrittura vi spara una System.UnauthorizedAccessException (esempio: GetFileAsync, GetFilesAsync, CreateFileAsync)
- Se fra le “File Type Associations” indicate i file JPG (è solo un esempio), la chiamata a GetFilesAsync() vi restituirà solamente quel particolare tipo di file, anche se sul disco ci sono altri tipi di file
- Le operazioni sui folder (creazione, lettura, etc.) non richiedono ovviamente alcuna voce definita fra le “File Type Associations”
- Parliamo un attimo di GetItemAsync ed affini. Questo metodo esposto da StorageFolder permette di ottenere un’istanza di IStorageItem che punta ad un file o cartella.
Se indicate il nome di una cartella, e questa cartella esiste, tutto bene.
Se la cartella non esiste, ottenete un’eccezione.
Se indicate il nome di un file, e questo file esiste, deve essere dichiarato nella sezione “File Type Associations” del file di manifest.
Se il file non esiste, ottenete un’eccezione. - Meglio usare TryGetItemAsync, che restituisce null nel caso in cui il file o la cartella non esiste
- Su uno smartphone Windows 10, è possibile ottenere un ID univoco della SD:
var id = await sf.Properties.RetrievePropertiesAsync(
new List<string>()
{ “WindowsPhone.ExternalStorageId” });
Direi che è tutto!