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