zoukankan      html  css  js  c++  java
  • 18、Compression

    1、Compression/Decompression sample:

          这个示例讲解如何运用 C# 在 Windows.Storage.Compression 命名空间压缩文件和解压缩文件的对象。

    压缩算法:

          默认(DEFAULT) : 没有显式地指定压缩算法。Xpress是默认情况下使用的。

          XPRESS : 压缩比是适中的。压缩和解压速度最快。最低内存需求。

          XPRESSHUFF : 压缩比是适中的。快速压缩和解压速度。低内存需求。

          MSZIP : 压缩比高。正常的压缩速度和快速减压的速度。低内存需求。

          LZMS : 压缩比是最高的。介质的压缩速度和正常解压速度。高内存需求。

    屏幕放置四个按钮,分别对应四种算法:

    对应的 xaml :

                    <Button x:Name="Default" Content="DEFAULT (XPRESS)" Margin="0,0,10,0" Click="Default_Click"/>
                    <Button x:Name="Xpress"  Content="XPRESS" Margin="0,0,10,0" Click="Xpress_Click"/>
                    <Button x:Name="XpressHuff"  Content="XPRESSHUFF" Margin="0,0,10,0" Click="XpressHuff_Click"/>
                    <Button x:Name="Mszip"  Content="MSZIP" Margin="0,0,10,0" Click="Mszip_Click"/>
                    <Button x:Name="Lzms"  Content="LZMS" Margin="0,0,10,0" Click="Lzms_Click"/>
    
    
    //文件压缩时的状态
     <TextBlock x:Name="Progress" Width="1000"  TextWrapping="Wrap" />


    对应的 C#, 五个按钮对应的压缩算法 :

          //DEFAULT (XPRESS)
            private void Default_Click(object sender, RoutedEventArgs e)
            {
                DoScenario(null);
            }
    
            //Xpress
            private void Xpress_Click(object sender, RoutedEventArgs e)
            {
                DoScenario(CompressAlgorithm.Xpress);
            }
    
           //XpressHuff       
            private void XpressHuff_Click(object sender, RoutedEventArgs e)
            {
                DoScenario(CompressAlgorithm.XpressHuff);
            }
    
           //Mszip    
            private void Mszip_Click(object sender, RoutedEventArgs e)
            {
                DoScenario(CompressAlgorithm.Mszip);
            }
    
           //Lzms      
            private void Lzms_Click(object sender, RoutedEventArgs e)
            {
                DoScenario(CompressAlgorithm.Lzms);
            }
    private async void DoScenario(CompressAlgorithm? Algorithm)
            {
                try
                {
                    Progress.Text = "";
    
                    // 如果本程序窗口处于 snapped  状态,尝试解除此状态
                    if ((ApplicationView.Value == ApplicationViewState.Snapped) &&
                        !ApplicationView.TryUnsnap())
                    {
                        throw new NotSupportedException("Sample doesn't work in snapped mode");
                    }
                    
                  //选择文件                
                    var picker = new FileOpenPicker();
                    picker.FileTypeFilter.Add("*");
                    var originalFile = await picker.PickSingleFileAsync();
                    
                    Progress.Text += String.Format("\"{0}\" has been picked\n", originalFile.Name);
    
                    //在原文件的名称后面加上 ".compressed"
                    var compressedFilename = originalFile.Name + ".compressed";
                    var compressedFile = await KnownFolders.DocumentsLibrary.CreateFileAsync(
    compressedFilename, CreationCollisionOption.GenerateUniqueName); Progress.Text
    += String.Format("\"{0}\" has been created to store compressed data\n", compressedFile.Name); // ** 压缩操作** // 1. 打开输入原始文件。 // 2.打开输出流在文件被压缩和包装成压缩机对象. // 3.复制原始流进压缩机包装器 // 4. 结束压缩机- 它把目标的标志到流中,然后输出中间缓冲 // buffers. // using (var originalInput = await originalFile.OpenReadAsync()) using (var compressedOutput = await compressedFile.OpenAsync(FileAccessMode.ReadWrite)) using (var compressor = !Algorithm.HasValue ? new Compressor(compressedOutput.GetOutputStreamAt(0)) : new Compressor(compressedOutput.GetOutputStreamAt(0), Algorithm.Value, 0))//所采用的压缩算法 { Progress.Text += "All streams wired for compression\n"; //复制源流到目标流。 var bytesCompressed = await RandomAccessStream.CopyAsync(originalInput, compressor); var finished = await compressor.FinishAsync();//完成压缩流编写。
    Progress.Text
    += String.Format("Compressed {0} bytes into {1}\n", bytesCompressed, compressedOutput.Size); } var decompressedFilename = originalFile.Name + ".decompressed"; var decompressedFile = await KnownFolders.DocumentsLibrary.CreateFileAsync(
    decompressedFilename, CreationCollisionOption.GenerateUniqueName); Progress.Text
    += String.Format("\"{0}\" has been created to store decompressed data\n", decompressedFile.Name); // ** 解压缩操作** // 1. 打开输入流在压缩文件并包装成减压器对象
    // 2. 从文件中打开输出流,然后将解压缩存储数据写入到文件中。 // 3. 从解压缩器(Decompressor)中把流复制到解压缩文件的流中 using (var compressedInput = await compressedFile.OpenSequentialReadAsync()) using (var decompressor = new Decompressor(compressedInput)) using (var decompressedOutput = await decompressedFile.OpenAsync(FileAccessMode.ReadWrite)) { Progress.Text += "All streams wired for decompression\n"; var bytesDecompressed = await RandomAccessStream.CopyAsync(decompressor, decompressedOutput); Progress.Text += String.Format("Decompressed {0} bytes of data\n", bytesDecompressed); } } catch (Exception ex) { //fail } }
  • 相关阅读:
    python自动生成小学四则运算题目
    软件工程第一章心得体会
    Python微信机器人
    利用python进行微信好友分析
    python操作数据库读书笔记
    初学爬虫之访问goole网页与爬取中国大学排名。
    python之预测体育竞技分析
    5、用python写一个自己的网页
    用turtle实现动态汉诺塔
    面向对象与正则表达式的学习(自动更正,和代数运算)
  • 原文地址:https://www.cnblogs.com/hebeiDGL/p/2693786.html
Copyright © 2011-2022 走看看