参考网上,略微改动,如添加entry.size=buffer.Length;这样压缩后的文件可以看到大小。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;
namespace ZipLibrary
{
/// <summary>
/// Zip yasuoyujieyasuo1
/// </summary>
public class ZipHelper
{
public static void ZipFile(string fileToZip, string zippedFile,
int compressionLevel, int blockSize)
{
if (!System.IO.File.Exists(fileToZip))
{
throw new System.IO.FileNotFoundException(fileToZip + "not existed");
}
using (FileStream ZipFile = File.Create(zippedFile))
{
using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
{
using (FileStream StreamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
{
string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
ZipEntry ZipEntry = new ZipEntry(fileName);
ZipEntry.Size = StreamToZip.Length;
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(compressionLevel);//0-9 0 no compression
byte[] buffer = new byte[blockSize];
int sizeRead = 0;
try
{
do
{
sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
ZipStream.Write(buffer, 0, sizeRead);
}
while (sizeRead > 0);
}
catch (Exception ex)
{
throw ex;
}
StreamToZip.Close();
}
ZipStream.Finish();
ZipStream.Close();
}
}
}
public static void ZipFile(string fileToZip, string zippedFile)
{
if(!File.Exists(fileToZip))
{
throw new FileNotFoundException(fileToZip +"not existed");
}
using(FileStream fs = File.OpenRead(fileToZip))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer,0,buffer.Length);
fs.Close();
using(FileStream ZipFile = File.Create(zippedFile))
{
using(ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
{
string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\")+1);
ZipEntry ZipEntry = new ZipEntry(fileName);
ZipEntry.Size = buffer.Length;
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(9);
ZipStream.Write(buffer,0,buffer.Length);
ZipStream.Finish();
ZipStream.Close();
}
}
}
}
public static void ZipFileDirectory(string strDirectory, string zippedFile)
{
using (FileStream ZipFile = File.Create(zippedFile))
{
using (ZipOutputStream s = new ZipOutputStream(ZipFile))
{
ZipSetp(strDirectory, s, "");
}
}
}
private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)
{
if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
{
strDirectory += Path.DirectorySeparatorChar;
}
Crc32 crc = new Crc32();
string[] filenames = Directory.GetFileSystemEntries(strDirectory);
foreach (string file in filenames)
{
if (Directory.Exists(file))
{
string pPath = parentPath;
pPath += file.Substring(file.LastIndexOf("\\") + 1);
pPath += "\\";
ZipSetp(file, s, pPath);
}
else
{
using (FileStream fs = File.OpenRead(file))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);
ZipEntry entry = new ZipEntry(fileName);
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);//entry
s.Write(buffer, 0, buffer.Length);
}
}
}
}
public static void UnZip(string zipedFile, string strDirectory, string password, bool overWrite)
{
if (string.IsNullOrEmpty(strDirectory))
strDirectory = Directory.GetCurrentDirectory();
if (!strDirectory.EndsWith("\\"))
strDirectory = strDirectory + "\\";
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))
{
s.Password = password;
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = "";
string pathToZip = "";
pathToZip = theEntry.Name;
if (pathToZip != "")
directoryName = Path.GetDirectoryName(pathToZip) + "\\";
string fileName = Path.GetFileName(pathToZip);
Directory.CreateDirectory(strDirectory + directoryName);
if (fileName != "")
{
if ((File.Exists(strDirectory + directoryName + fileName) &&
overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))
{
using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName))
{
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
streamWriter.Write(data, 0, size);
else
break;
}
streamWriter.Close();
}
}
}
}
s.Close();
}
}
}
}
交互代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace ZipTest
{
public partial class ZipTestForm : Form
{
public ZipTestForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (DialogResult.OK == folderBrowserDialog1.ShowDialog())
{
this.textBox1.Text = folderBrowserDialog1.SelectedPath;
}
}
private void button2_Click(object sender, EventArgs e)
{
ZipLibrary.ZipHelper.ZipFileDirectory(this.textBox1.Text, this.textBox1.Text+".zip");
}
private void button3_Click(object sender, EventArgs e)
{
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.textBox2.Text = openFileDialog1.FileName;
}
}
private void button4_Click(object sender, EventArgs e)
{
if (File.Exists(this.textBox2.Text))
{
string destPath=Path.Combine(Path.GetDirectoryName(textBox2.Text),Path.GetFileNameWithoutExtension(textBox2.Text));
ZipLibrary.ZipHelper.UnZip(textBox2.Text, destPath,tbPassword.Text,false);
}
}
private void button5_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
this.textBox3.Text = openFileDialog1.FileName;
}
}
private void button6_Click(object sender, EventArgs e)
{
if(File.Exists(this.textBox3.Text))
ZipLibrary.ZipHelper.ZipFile(this.textBox3.Text, this.textBox3.Text + ".zip");
}
}
}