Area di riferimento
- Implementing serialization and input/output functionality in a .NET Framework application (18 percent)
- Compress or decompress stream information in a .NET Framework application and improve the security of application data by using isolated storage
- May include but is not limited to: IsolatedStorageFile class, IsolatedStorageFileStream class;
- DeflateStream class; GZipStream class
GZipStream and DeflateStream classes
La classi GZipStream e DeflateStream permettono di comprimere dati utilizzando il famoso algoritmo di compressione Gzip. Conviene utilizzare la classe GZipStream nel caso in cui si intenda distribuire i file in modo che questi possano essere decompressi utilizzando l'ampiamente diffuso tool gzip.
Queste classi si trovano nel namespace System.IO.Compression e il loro utilizzo è molto semplice.
class Program
{
static void Main(string[] args)
{
File.WriteAllText("source.txt", "Il contenuto di questo file verra' compresso.");
// File compression
using (FileStream sourceFile = File.Open("source.txt", FileMode.Open))
{
using (FileStream destinationFile = File.Open("destination.dat", FileMode.Create))
{
using (GZipStream comp = new GZipStream(destinationFile, CompressionMode.Compress))
{
int b;
while ((b = sourceFile.ReadByte()) != -1)
{
comp.WriteByte((byte)b);
}
}
}
}
// File decompression
using (FileStream sourceFile = File.Open("destination.dat", FileMode.Open))
{
using (FileStream destinationFile = File.Open("new-source.txt", FileMode.Create))
{
using (GZipStream decomp = new GZipStream(sourceFile, CompressionMode.Decompress))
{
int b;
while ((b = decomp.ReadByte()) != -1)
{
destinationFile.WriteByte((byte)b);
}
}
}
}
Console.WriteLine(File.ReadAllText("new-source.txt"));
Console.ReadKey();
}
}
Isolated Storage
L'Isolated Storage è un repository all'interno del quale è possibile leggere e scrivere dati in maniera sicura indipendentemente dai privilegi di cui disponde il codice.
La prima cosa da fare quando si lavora con l'isolated storage è scegliere l'ambito in cui saranno memorizzati i dati:
- Assembly/Machine : Si utilizza questo ambito per persistere dati a livello di applicazione.
- Assembly/User : Si utilizza questo ambito per persistere dati a livello di utente. Ogni utente della macchina avrà le sue impostazioni specifiche.
- ...
L'utilizzo dell'Isolated Storage ruota intorno alle classi IsolatedStorageFile e IsolatedStorageFileStream. E' inoltre possibile utilizzare l'attributo IsolatedStorageFilePermission per specificare il permesso di accedere all'Isolated Storage e impostare altri parametri come ad esempio la quota massima di spazio da associare a ciascun utente.
[IsolatedStorageFilePermission(SecurityAction.Demand, UserQuota=256)]
class Program
{
static void Main(string[] args)
{
// Assembly/Machine Scope - Writing data
IsolatedStorageFile applicationStorage = IsolatedStorageFile.GetMachineStoreForAssembly();
IsolatedStorageFileStream applicationStream =
new IsolatedStorageFileStream("application-settings.dat", FileMode.Create, applicationStorage);
using (StreamWriter writer = new StreamWriter(applicationStream))
{
writer.Write("Informazioni a livello applicazione");
}
// User/Machine Scope - Writing data
IsolatedStorageFile userStorage = IsolatedStorageFile.GetUserStoreForAssembly();
IsolatedStorageFileStream userStream =
new IsolatedStorageFileStream("user-settings.dat", FileMode.Create, userStorage);
using (StreamWriter writer = new StreamWriter(userStream))
{
writer.Write("Informazioni a livello utente in user-settings.dat");
}
userStorage.CreateDirectory("folder");
userStream = new IsolatedStorageFileStream(@"folder\user-settings.dat", FileMode.Create, userStorage);
using (StreamWriter writer = new StreamWriter(userStream))
{
writer.Write("Informazioni a livello utente in folder\\user-settings.dat");
}
// Reading data
Console.WriteLine("Directories :");
foreach (string directory in userStorage.GetDirectoryNames("*"))
{
Console.WriteLine(directory);
}
Console.WriteLine("Files *.dat :");
foreach (string file in userStorage.GetFileNames("*.dat"))
{
Console.WriteLine(file);
}
Console.ReadKey();
}
}