[70-536] Compressing Streams

Lesson 3

Compressing Streams

Alcune volte è necessario comprimere uno stream per risparmiare spazio o banda: ci aiutano le classi GZipStream e DeflateStream. Entrambe si limitano a comprimere dati fino a 4GB.

La differenza tra le due è che la prima permette l'introduzione di determinati header per includere informazioni extra utili alla decompressione dello stream. Ne deriva che il file scritto con DeflateStream è più piccolo.

Per comprimere:

FileStream sourceFile = File.OpenRead(inFileName);
FileStream destinationFile = File.Create(outFileName);
GZipStream compStream = new GZipStream(destFile, CompressionMode.Compress);
int theByte = sourceFile.ReadByte();
while(theByte != -1)
{
compStream.WriteByte((byte)theByte);
theByte = sourceFile.ReadByte();
}

Per decomprimere:

FileStream sourceFile = FileOpenRead(inFileName);
FileStream destinationFile = File.Create(outFileName);
GZipStream compStream = new GZipStream(sourceFile, CompressionMode.Decompress);
int theByte = compStream.ReadByte();
while(theByte != -1)
{
destFile.WriteByte((byte)theByte);
theByte = compStream.ReadByte();
}
Technorati tags:

[70-536] Reading and writing files

Lesson 2

Reading and writing files

Questo argomento si apre parlando della classe Stream e delle classi derivate:

  • FileStream
  • MemoryStream
  • CryptoStream
  • NetworkStream
  • GZipStream

Ci sono altre classi correlate come File e Directory (entrambe statiche), FileAccess (enum con Read, Write and ReadWrite), FileMode (enum con Append, Create, CreateNew, Open, OpenOrCreate, Truncate - CreateNew rilancia eccezione se il file esiste, Open rilancia eccezione se il file non esiste, Truncate svuota il file).

Per leggere da un file:

FileStream theFile = File.Open(@"C:\boot.ini", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(theFile); //anche File.OpenText(@"C:\boot.ini");
Console.Write(sr.ReadToEnd()); //anche un WriteLine(File.ReadAllText(@"C:\boot.ini");
sr.Close();
theFile.Close();

 Per scrivere un file:

FileStream theFile = File.Create(@"C:\file.ini");
StreamWriter writer = new StreamWriter(theFile); //anche File.CreateText(@"C:\file.ini");
writer.WriteLine("Hello"); //anche un File.WriteAllText(@"C:\boot.ini", "Hello");
writer.Close();
theFile.Close();

Per scrivere e leggere le classi derivano dalle astratte TextReader e TextWriter: StreamWriter e StreamReader o StringReader e StringWriter o BinaryReader e BinaryWriter.

Concetti simili per scritture in memorie con MemoryStream.

Per migliorare le performance è utile la classe BufferedStream che si interpone tra gli stream esistenti:

FileStream newFile = File.Create(@"C:\test.txt");
BufferedStream buffered = new BufferedStream(newFile);
StreamWriter writer = new StreamWriter(buffered);
writer.WriteLine("Some data");
writer.Close();
Technorati tags:

[70-536] Input/Output

Lesson 1

Input/Output

Tutto parte dal namespace System.IO.

Abbiamo classi che derivano da FileSystemInfo (FileInfo e DirectoryInfo a cui si aggiunge DriveInfo che non deriva da questa) per avere informazioni circa l'input/output e classi di utilità come File, Directory, Path. Da queste classi è possibile effettuare tutte le più comuni operazioni su file e directory.

A queste classi si aggiunge il FileSystemWatcher per monitorare cambiamenti nel file system.

Da ricordare che il cambio di estensione è logico e non fisico!


Technorati tags: