using System;
using System.IO;
using System.IO.Compression;

namespace Skyiv.Helper


{
static class Zip

{
public static void CompressFile(string sourceFile, string destinationFile)

{
if (!File.Exists(sourceFile)) throw new FileNotFoundException();
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read))

{
byte [] buffer = new byte[sourceStream.Length];
int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);
if (checkCounter != buffer.Length) throw new ApplicationException();
using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))

{
using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))

{
compressedStream.Write(buffer, 0, buffer.Length);
}
}
}
}
public static void DecompressFile(string sourceFile, string destinationFile)

{
if (!File.Exists( sourceFile)) throw new FileNotFoundException();
using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))

{
byte [] quartetBuffer = new byte[4];
int position = (int)sourceStream.Length - 4;
sourceStream.Position = position;
sourceStream.Read(quartetBuffer, 0, 4);
sourceStream.Position = 0;
int checkLength = BitConverter.ToInt32(quartetBuffer, 0);
byte[] buffer = new byte[checkLength + 100];
using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))

{
int total = 0;
for (int offset = 0; ; )

{
int bytesRead = decompressedStream.Read(buffer, offset, 100);
if (bytesRead == 0) break;
offset += bytesRead;
total += bytesRead;
}
using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))

{
destinationStream.Write(buffer, 0, total);
destinationStream.Flush();
}
}
}
}
}
}

using System;
using System.IO;
using Skyiv.Helper;

namespace Skyiv.Test


{
sealed class TestMain

{
static void Main()

{
try

{

string [] nameList =
{"zip.zip", "zip.cs", "zip.txt"};
Zip.CompressFile(nameList[1], nameList[0]);
Zip.DecompressFile(nameList[0], nameList[2]);
foreach (string name in nameList)

{
Console.WriteLine("{0,-11}: {1,11:N0} bytes", name, new FileInfo(name).Length);
}
}
catch (Exception ex)

{
Console.WriteLine(ex.Message);
}
}
}
}
posted on
2006-03-03 22:27
blue
阅读(
961)
评论()
编辑
收藏
举报
点击右上角即可分享
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步