Komprese, stopky a lepší práce s konzolí ve Whidbey

Nový .NET framework přináší řadu funkcí, které předtím nebyly dostupné buď vůbec a nebo mnohem komplikovaněji. V dnešním příkladu se podíváme na tři z nich.

GZIP a DEFLATE komprese

Nový .NET nabízí podporu pro kompresi dat, metodou GZIP a DEFLATE. GZIP komprese je průmyslovým standardem a používá se například pro kompresi přenosů přes HTTP. Ve stávající verzi 1.1 je možno s úspěchem použít open source knihovnu SharpZipLib, ale zahrnutí této funkce do "core" frameworku je jistě výhodou.

Podotýkám, že GZIP se nerovná klasickému ZIP archivu, jedná se o sice podobnou, leč ne stejnou technologii. Dále je nutno si uvědomit, že GZIP ukládá pouze vlastní komprimovaná data, nikoliv další informace o nich (jako třeba název souboru a podobně). Tento formát je tedy vhodný pro vnitřní použití v rámci aplikace, ne pro poskytování dat běžným uživatelům.

Užití dojde zejména v souvislosti s XML soubory. Data ve formátu XML mají mnoho výhod a bezprecedentní podporu ze strany .NET. Na druhou stranu je ale XML formát neuvěřitelně "ukecaný". Dá se ovšem s výhodou komprimovat. Pomocí několika řádků nyní můžete XML dokument uložit ve zkomprimované podobě a při načtení ho zase dekomprimovat.

Z programátorského hlediska je komprese realizována formou streamu, konkrétně třídy System.IO.Compression.GZipStream. V jejím konstruktoru specifikujete underlying stream (tedy stream, do kterého se budou data fyzicky zapisovat, nebo se z něj číst, např. soubor) a  pak jenom zapisujete či čtete data a GZipStream funguje jako filtr - obdobnou implementaci najdete například u šifrování.

Lepší práce s konzolí

Ačkoliv se rozhraní příkazové řádky může zdát primitivní, pro řadu úkolů (zejména z praxe administrátora) je stále tou nejlepší volbou. .NET ve verzi 1.1 umí s textovou konzolí pracovat základním způsobem (také v podstatě jako se streamem).

Verze 2.0 přináší několik užitečných nových vlastností. Zejména pak vlastnosti Console.ForegroundColor a Console.BackgroundColor, sloužící k nastavení barev a nadmíru užitečné Console.CursorLeft a Console.CursorTop, sloužící.k nastavení pozice kurzoru.

Právě vlastnosti pro nastavení pozice kurzoru je možno použít například pro měnící se zobrazování stavu zpracování (průběh komprese/dekomprese v procentech).

Stopky

Často je třeba změřit, jak dlouho trvala určitá operace. V zásadě je k tomu možno použít obyčejnou proměnnou typu DateTime a odečíst rozdíl. Ve Whidbey je tato funkcionalita zapouzdřena do třídy System.Diagnostics.Stopwatch. Ovládá se pomocí metod Start, Stop a Reset, aktuální hodnotu zjistíte například pomocí vlastnosti Elapsed.

Praktický příklad

Následující procedura slouží ke zkomprimování souboru metodou GZIP. Měří čas zpracování a postupně zobrazuje průběh:

Sub CompressFile(ByVal InFileName As String, ByVal OutFileName As String)
    Const BufferSize As Int32 = 65536 ' 64 kB
    ' Start stopwatch
    Dim SW As New System.Diagnostics.Stopwatch()
    SW.Start()
    ' Prepare streams
    Dim InStream As New System.IO.FileStream(InFileName, IO.FileMode.Open, IO.FileAccess.Read)
    Dim OutStream As New System.IO.FileStream(OutFileName, IO.FileMode.Create, IO.FileAccess.Write)
    Dim ZipStream As New System.IO.Compression.GZipStream(OutStream, IO.Compression.CompressionMode.Compress, True)
    ' Compress
    Dim Data(BufferSize) As Byte
    Dim BytesRead As Int32
    Do
        BytesRead = InStream.Read(Data, 0, BufferSize)
        ZipStream.Write(Data, 0, BytesRead)
        ' Show progress
        Console.Write("Progress: {0:N2}%", InStream.Position / InStream.Length * 100)
        Console.CursorLeft = 0
    Loop While BytesRead = BufferSize
    ' Clean up
    SW.Stop()
    Console.WriteLine("Compression completed in {0:N2} seconds.", SW.Elapsed.TotalSeconds)
    ZipStream.Close()
    OutStream.Close()
    InStream.Close()
End Sub

Můžete si stáhnout zdrojové kódy kompletní konzolové aplikace ve VB.NET umožňující kompresi a dekompresi dat metodou GZIP.

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET