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 } }

 

转载于:https://www.cnblogs.com/hebeiDGL/archive/2012/09/19/2693786.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值