基于 .Net Framework 类库的文件压缩与解压
- 从 .Net Framework 4.5 开始增加了对文件进行压缩与解压操作的类库
注:需要引用的程序集
using System.IO.Compression;
using System.IO.Compression.FileSystem;
- 类似于对文件和目录的操作,对于压缩文件也提供了两种方式:
ZipArchive
和 ZipFile
,分别对应两个新增加的类 ZipArchive
和 ZipFile
。这两个类都定义在命名空间 System.IO.Compression
中。
定义路径
- 为了后面演示方便,我们定义一个表示压缩文件路径的常量。
const string zipFilePath = @"..\..\Sample.zip";
使用 ZipArchive
创建压缩文件
- 创建一个空的压缩文件,使用 ZipArchiveMode.Create 创建参数。
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{
}
}
创建并添加文件
- 通常,在创建的同时,我们就会加入一些文件,下面的例子中,我们将当前的执行程序文件本身加到压缩文件中。
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Create))
{
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Create))
{
System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
string path = assemble.Location;
string filename = System.IO.Path.GetFileName(path);
ZipArchiveEntry readMeEntry = archive.CreateEntry(filename);
using (System.IO.Stream stream = readMeEntry.Open())
{
byte[] bytes = System.IO.File.ReadAllBytes(path);
stream.Write(bytes, 0, bytes.Length);
}
}
}
列出压缩文件内容
- 当然,也可以通过程序检查压缩文件的内容了。使用 Read 方式就可以了。
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{
foreach (var zipArchiveEntry in archive.Entries)
Console.WriteLine("FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName);
}
}
提取压缩文件
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read))
{
ZipArchiveEntry entry = archive.GetEntry("ZipArchiveSample.exe");
Console.WriteLine(entry.Name);
using (System.IO.Stream stream = entry.Open())
{
System.IO.Stream output = new FileStream("http://www.cnblogs.com/ZipArchiveSample.exe", FileMode.Create);
int b = -1;
while ((b = stream.ReadByte()) != -1)
{
output.WriteByte((byte) b);
}
output.Close();
}
}
}
更新压缩文件
- 在压缩文件已经创建之后,还可以打开它,继续添加文件,这就称为更新了,使用 Update 模式。
using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
{
using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update))
{
System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
string path = assemble.Location;
string filename = System.IO.Path.GetFileName( path);
ZipArchiveEntry readMeEntry = archive.CreateEntry( filename );
using (System.IO.Stream stream = readMeEntry.Open() )
{
byte[] bytes = System.IO.File.ReadAllBytes(path);
stream.Write(bytes, 0, bytes.Length);
}
foreach (var zipArchiveEntry in archive.Entries)
{
Console.WriteLine("FullName of the Zip Archive Entry: {0}", zipArchiveEntry.FullName);
}
}
}
使用 ZipFile
- 除了上边的基本方法之外,还有一些简单的使用方法。这涉及到另外一个类:ZipFile。
创建空压缩文件
System.IO.File.Delete(zipFilePath);
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
}
创建并添加文件
- 直接添加一个文件的方法。直接使用 CreateEntryFromFile 就可以了。
System.IO.File.Delete(zipFilePath);
using (ZipArchive zipArchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
{
System.Reflection.Assembly assemble = System.Reflection.Assembly.GetExecutingAssembly();
string path = assemble.Location;
string filename = System.IO.Path.GetFileName(path);
zipArchive.CreateEntryFromFile(path, filename);
}
解压文件
ZipFile.ExtractToDirectory(zipFilePath, "../..");
压缩一个目录
- 还可以直接将一个目录中所有的文件都压缩到一个压缩文件中。
System.IO.File.Delete(zipFilePath);
ZipFile.CreateFromDirectory(".", zipFilePath);