一、运行效果
二、实现过程
①、文件/目录选择
选择zip保存文件SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "zip files(*.zip)|*.zip";
if (saveFile.ShowDialog() == DialogResult.OK)
{
txtSaveZipFileName.Text = saveFile.FileName;
if (!btnCompress.Enabled)
btnCompress.Enabled = true;
}
选择多个原始文件OpenFileDialog openFile = new OpenFileDialog();
openFile.Multiselect = true;
if (openFile.ShowDialog() == DialogResult.OK)
lstFileName.Items.AddRange(openFile.FileNames);
选择解压到目录FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
if (folderBrowser.ShowDialog() == DialogResult.OK)
lstFileName.Items.Add(folderBrowser.SelectedPath);
②、带进度报告功能的文件目录压缩/解压缩方法
批量压缩文件/目录///
/// Pack ListBox Items
///
/// The ListItems you want to zip
/// Target zipFile Path
/// report process delegate
public void PackListItems(ListBox lstFileName, string zipedFile, ProcessChange changedDG)
{
if (lstFileName.Items.Contains(zipedFile))
{
MessageBox.Show("原始文件不能包含最终的压缩文件!");
return;
}
using (FileStream ZipFile = File.Create(zipedFile))
{
using (ZipOutputStream s = new ZipOutputStream(ZipFile))
{
s.SetLevel(3); //0-9, 9 being the highest level of compression
string key = Guid.NewGuid().ToString(); //Guid Key
double totalCount = 0;
foreach (string f in lstFileName.Items)
{
//总需要压缩的文件数量
if (File.Exists(f))
totalCount++;
else if (Directory.Exists(f))
totalCount += Directory.GetFileSystemEntries(f, "*", SearchOption.AllDirectories).Count();
}
ProcessItems.Add(key, new ProcessItem(totalCount));
List fsi = new List();
foreach (string f in lstFileName.Items)
{
//总需要压缩