In ogni applicazione che si rispetti, persistere i dati e le impostazioni è un requisito minimo che permette un utilizzo nel tempo dell'applicazione. Per compiere questo compito solitamente vengono sfruttati i file che in ambiente ASP.NET (server) o Windows (client) permettono di salvare qualsiasi informazione in formato binario, serializzando eventualmente gli oggetti.
In ambienti più limitati, come in Silverlight e Windows Phone, per ragioni di sicurezza non è concesso utilizzare liberamente le classi di System.IO, perché sostanzialmente non è possibile scrivere sul disco del PC o sullo storage del device. In realtà, anche nelle applicazioni Windows non è consentito scrivere in tutti i percorsi e spesso è stato, ed è, causa di malfunzionamenti di applicazioni che tentano di scrivere senza i requisiti necessari, pretendendo di funzionare con privilegi di amministratore.
Per risolvere questo problema e scaricare il problema della sicurezza, sin dal .NET Framework 1.0 sono presenti alcune classi, contenute nel namespace System.IO.IsolatedStorage, che permettono di identificare uno storage virtuale, dove è possibile leggere, scrivere file o gestire directory. La particolarità sta nel fatto che questo storage virtuale, sebbene poi fisicamente scriva sul file system del sistema, è completamente isolato a seconda del contesto in cui vive, garantendo la sicurezza e la tranquillità di accesso al suo contenuto.
Principi di IsolatedStorage
Il suo utilizzo è piuttosto semplice, perché molto simile alla normale creazione dei file, ma differisce solo dal modo in cui si ottiene lo Stream per la scrittura. Prima di tutto è necessario creare lo storage partendo dallo scopo che si vuole ottenere: a seconda dell'ambiente (WinForm, ASP.NET, Silverlight e Windows Phone) la classe IsolatedStorageFile dispone di metodi statici come GetUserStoreForApplication o GetUserStoreForSite (in WinForm si ha anche per dominio, per assembly, per utente o per macchina) che restituiscono un'istanza della classe stessa.// Ottengo lo storage per l'applicazione using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication()) { // Operazioni sullo storage... }
Accesso al file system
Con la classe IsolatedStorageFile è possibile operare come se fosse un file system, con una serie di metodi come CreateDirectory, CreateFile, GetFileNames, MoveFile e tanti altri. Nell'esempio seguente si crea una cartella e si utilizza CreateFile per ottenere uno IsolatedStorageFileStream (una specializzazione di Stream) che permette di scrivere nel file attraverso gli strumenti standard di manipolazione dello Stream (StreamWriter, StreamReader, BinaryReader, BinaryWriter ecc).// Creo una cartella if (!storage.DirectoryExists("mydir")) storage.CreateDirectory("mydir"); // Creo il file (sovrascrivo se esiste) using (IsolatedStorageFileStream stream = storage.CreateFile("mydir\\test.txt")) { // Scrivo nello Stream byte[] data = Encoding.Unicode.GetBytes("Ciao mondo!"); stream.Write(data, 0, data.Length); }
Grazie a questo storage l'utente ha la garanzia della sicurezza delle informazioni, perché in ambienti come Silverlight è possibile controllarlo e svuotarlo. In Windows Phone, ad esempio, viene cancellato con la rimozione dell'applicazione.
Occorre precisare che lo spazio non è infinito, ma esiste una quota iniziale (di 1 MB su Silverlight, 50 MB su Silverlight se l'applicazione viene installata, 2 GB su Windows Phone) che è possibile conoscere con la proprietà Quota, così come aumentare con il metodo IncreaseQuotaTo.
Infine, sebbene non esistano strumenti ufficiali su Silverlight e Windows Phone che permettano di avere un motore relazionale, esistono soluzioni di terze parti che forniscono motori relazionali basati sull'isolated storage. La persistenza dei dati binaria, infatti, permette di gestire liberamente il modo in cui un layer sovrastante possa leggere e scrivere i byte.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire attività basate su eventi con Azure Container Jobs
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Gestione dei nomi con le regole @layer in CSS
Reactive form tipizzati con modellazione del FormBuilder in Angular
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Cambiare la chiave di partizionamento di Azure Cosmos DB
Eseguire query manipolando liste di tipi semplici con Entity Framework Core
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Reactive form tipizzati con FormBuilder in Angular
Usare le navigation property in QuickGrid di Blazor
Generare velocemente pagine CRUD in Blazor con QuickGrid
Utilizzare QuickGrid di Blazor con Entity Framework