使用.NET压缩文件

貌似10几天都没有更新了, 因为正在苦练F#内功心法, 同时还要现学现用完成一个S/C模式的管理系统, 实在是有些心力不足.

.NET命令空间System.IO.Compression提供了基本的流压缩实现, 其中包含RFC文档中规定的DeflateGZip两种算法.

两种算法有许多相同点:

  • 不涉及专利使用权
  • 采用LZ77 算法和霍夫曼编码 (压缩率基本相同)
  • 无损压缩
  • 重复压缩只会导致体积更大
  • 不能用于压缩大于 4 GB 的文件
  • 原本并不提供向 .zip 存档中添加或提取文件

也有一些区别:

  • GZip包括一个检测数据损坏的循环冗余校验值
  • GZip压缩后的文件可以用大多数解压缩软件打开

总的来讲, GZip略胜一筹. 下面是F#代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#light
open System.IO
open System.IO.Compression
// GZip压缩文件
// 参数: 文件名 字据
let GZipWrite (filename : string) (data : string) =
// 创建文件流
use fileStream = new FileStream(filename, FileMode.Create, FileAccess.Write)
// 创建压缩流
use compressionStream = new GZipStream(fileStream, CompressionMode.Compress)
use writer = new StreamWriter(compressionStream)
// 将数据写入流中
writer.Write(box data)
writer.Close()
// GZip解压文件
// 参数: 文件名
// 返回: 数据
let GZipRead filename =
use fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read)
use compressionStream = new GZipStream(fileStream, CompressionMode.Decompress)
use reader = new StreamReader(compressionStream)
let data = reader.ReadToEnd()
reader.Close()
data