基于(ICSharpCode.SharpZipLib.dll)的文件压缩方法,类文件

ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.IO;
using System.Collections;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;


namespace FileCompress
{
    
/// <summary>
    
/// 功能:压缩文件
    
/// creator chaodongwang 2009-11-11
    
/// </summary>
    public class ZipClass
    {
        
/// <summary>
        
/// 压缩单个文件
        
/// </summary>
        
/// <param name="FileToZip">被压缩的文件名称(包含文件路径)</param>
        
/// <param name="ZipedFile">压缩后的文件名称(包含文件路径)</param>
        
/// <param name="CompressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
        
/// <param name="BlockSize">缓存大小</param>
        public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel)
        {
            
//如果文件没有找到,则报错 
            if (!System.IO.File.Exists(FileToZip))
            {
                
throw new System.IO.FileNotFoundException("文件:" + FileToZip + "没有找到!");
            }

            
if (ZipedFile == string.Empty)
            {
                ZipedFile 
= Path.GetFileNameWithoutExtension(FileToZip) + ".zip";
            }

            
if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile 
= ZipedFile + ".zip";
            }

            
////如果指定位置目录不存在,创建该目录
            //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
            
//if (!Directory.Exists(zipedDir))
            
//    Directory.CreateDirectory(zipedDir);

            
//被压缩文件名称
            string filename = FileToZip.Substring(FileToZip.LastIndexOf('\\'+ 1);
            
            System.IO.FileStream StreamToZip 
= new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
            System.IO.FileStream ZipFile 
= System.IO.File.Create(ZipedFile);
            ZipOutputStream ZipStream 
= new ZipOutputStream(ZipFile);
            ZipEntry ZipEntry 
= new ZipEntry(filename);
            ZipStream.PutNextEntry(ZipEntry);
            ZipStream.SetLevel(CompressionLevel);
            
byte[] buffer = new byte[2048];
            System.Int32 size 
= StreamToZip.Read(buffer, 0, buffer.Length);
            ZipStream.Write(buffer, 
0, size);
            
try
            {
                
while (size < StreamToZip.Length)
                {
                    
int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                    ZipStream.Write(buffer, 
0, sizeRead);
                    size 
+= sizeRead;
                }
            }
            
catch (System.Exception ex)
            {
                
throw ex;
            }
            
finally
            {
                ZipStream.Finish();
                ZipStream.Close();
                StreamToZip.Close();
            }
        }

        
/// <summary>
        
/// 压缩文件夹的方法
        
/// </summary>
        public void ZipDir(string DirToZip, string ZipedFile, int CompressionLevel)
        {
            
//压缩文件为空时默认与压缩文件夹同一级目录
            if (ZipedFile == string.Empty)
            {
                ZipedFile 
= DirToZip.Substring(DirToZip.LastIndexOf("\\"+ 1);
                ZipedFile 
= DirToZip.Substring(0, DirToZip.LastIndexOf("\\")) +"\\"+ ZipedFile+".zip";
            }

            
if (Path.GetExtension(ZipedFile) != ".zip")
            {
                ZipedFile 
= ZipedFile + ".zip";
            }

            
using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(ZipedFile)))
            {
                zipoutputstream.SetLevel(CompressionLevel);
                Crc32 crc 
= new Crc32();
                Hashtable fileList 
= getAllFies(DirToZip);
                
foreach (DictionaryEntry item in fileList)
                {
                    FileStream fs 
= File.OpenRead(item.Key.ToString());
                    
byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 
0, buffer.Length);
                    ZipEntry entry 
= new ZipEntry(item.Key.ToString().Substring(DirToZip.Length + 1));
                    entry.DateTime 
= (DateTime)item.Value;
                    entry.Size 
= fs.Length;
                    fs.Close();
                    crc.Reset();
                    crc.Update(buffer);
                    entry.Crc 
= crc.Value;
                    zipoutputstream.PutNextEntry(entry);
                    zipoutputstream.Write(buffer, 
0, buffer.Length);
                }
            }
        }

        
/// <summary>
        
/// 获取所有文件
        
/// </summary>
        
/// <returns></returns>
        private Hashtable getAllFies(string dir)
        {
            Hashtable FilesList 
= new Hashtable();
            DirectoryInfo fileDire 
= new DirectoryInfo(dir);
            
if (!fileDire.Exists)
            {
                
throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
            }

            
this.getAllDirFiles(fileDire, FilesList);
            
this.getAllDirsFiles(fileDire.GetDirectories(), FilesList);
            
return FilesList;
        }
        
/// <summary>
        
/// 获取一个文件夹下的所有文件夹里的文件
        
/// </summary>
        
/// <param name="dirs"></param>
        
/// <param name="filesList"></param>
        private void getAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
        {
            
foreach (DirectoryInfo dir in dirs)
            {
                
foreach (FileInfo file in dir.GetFiles("*.*"))
                {
                    filesList.Add(file.FullName, file.LastWriteTime);
                }
                
this.getAllDirsFiles(dir.GetDirectories(), filesList);
            }
        }
        
/// <summary>
        
/// 获取一个文件夹下的文件
        
/// </summary>
        
/// <param name="strDirName">目录名称</param>
        
/// <param name="filesList">文件列表HastTable</param>
        private void getAllDirFiles(DirectoryInfo dir, Hashtable filesList)
        {
            
foreach (FileInfo file in dir.GetFiles("*.*"))
            {
                filesList.Add(file.FullName, file.LastWriteTime);
            }
        }
    }
}
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;
using System.Collections.Generic;
/// <summary> 
/// 解压文件 
/// </summary> 

using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;

using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams; 

namespace FileCompress
{
    
/// <summary>
    
/// 功能:解压文件
    
/// creator chaodongwang 2009-11-11
    
/// </summary>
    public class UnZipClass
    {
        
/// <summary>
        
/// 功能:解压zip格式的文件。
        
/// </summary>
        
/// <param name="zipFilePath">压缩文件路径</param>
        
/// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
        
/// <param name="err">出错信息</param>
        
/// <returns>解压是否成功</returns>
        public void UnZip(string zipFilePath, string unZipDir)
        {
            
if (zipFilePath == string.Empty)
            {
                
throw new Exception("压缩文件不能为空!");
            }
            
if (!File.Exists(zipFilePath))
            {
                
throw new System.IO.FileNotFoundException("压缩文件不存在!");
            }
            
//解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
            if (unZipDir == string.Empty)
                unZipDir 
= zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
            
if (!unZipDir.EndsWith("\\"))
                unZipDir 
+= "\\";
            
if (!Directory.Exists(unZipDir))
                Directory.CreateDirectory(unZipDir);

            
using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
            {

                ZipEntry theEntry;
                
while ((theEntry = s.GetNextEntry()) != null)
                {
                    
string directoryName = Path.GetDirectoryName(theEntry.Name);
                    
string fileName = Path.GetFileName(theEntry.Name);
                    
if (directoryName.Length > 0)
                    {
                        Directory.CreateDirectory(unZipDir 
+ directoryName);
                    }
                    
if (!directoryName.EndsWith("\\"))
                        directoryName 
+= "\\";
                    
if (fileName != String.Empty)
                    {
                        
using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
                        {

                            
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;
                                }
                            }
                        }
                    }
                }
            }
        }
    } 
}

vs.net(c#.net)实例下载

/Files/chaodongwang/FileCompress.rar

转载于:https://www.cnblogs.com/chaodongwang/archive/2009/11/11/1600821.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值