解压缩文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace CommonHelper
{  //引用的实体类
    using ICShareCode.SharpZipLib;
    using ICShareCode.SharpZipLib.Zip;
    using ICShareCode.SharpZipLib.Checksums;

    public class ZipHelper
    {
        /// <summary>
        /// 压缩单个文件
        /// </summary>
        /// <param name="fileToZip">要压缩的文件</param>
        /// <param name="zipedFile">压缩后的文件</param>
        /// <param name="compressionLevel">压缩等级</param>
        /// <param name="blockSize">每次写入大小</param>
        public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)
        {
            if (File.Exists(fileToZip) == false)
            {
                throw new FileNotFoundException("指定压缩文件:"+fileToZip+" 不存在");
            }
            using (FileStream ZipFile=File.Create(zipedFile))
            {
                using (ZipOutputStream ZipStream=new ZipOutputStream(ZipFile))
                {
                    using (FileStream StreamToZip=new FileStream(fileToZip,FileMode.Open,FileAccess.Read))
                    {
                        string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);

                        ZipEntity zipEntity = new ZipEntity(fileName);

                        ZipStream.PutNextEntry(zipEntity);

                        ZipStream.SetLevel(compressionLevel);

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

                        ZipStream.Finish();
                        ZipStream.Close();
                    }

                    ZipStream.Finish();
                    ZipStream.Close();
                }
                ZipFile.Close();
            }
        }

        /// <summary>
        /// 压缩单个文件
        /// </summary>
        /// <param name="fileToZip">要压缩的文件名</param>
        /// <param name="zipedFile">压缩后生成的压缩文件名</param>
        public static void ZipFile(string fileToZip, string zipedFile)
        {
            //如果没有找到则报错
            if (File.Exists(fileToZip)==false)
            {
                throw new FileNotFoundException("指定压缩文件:" + fileToZip + " 不存在");
            }

            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(zipedFile))
                {
                    using (ZipOutputStream ZipStream=new ZipOutputStream(ZipFile))
                    {
                        string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);
                        ZipEntity zipEntry = new ZipEntity(fileName);
                        ZipStream.PutNextEntry(zipEntry);
                        ZipStream.SetLevel(5);

                        ZipStream.Write(buffer, 0, buffer.Length);
                        ZipStream.Finish();
                        ZipStream.Close();
                    }
                }
            }
        }

        /// <summary>
        /// 压缩多层目录
        /// </summary>
        /// <param name="strDirectory"></param>
        /// <param name="zipedFile"></param>
        public static void ZipFileDirectory(string strDirectory, string zipedFile)
        {
            using (FileStream ZipFile=File.Create(zipedFile))
            {
                using (ZipOutputStream s=new ZipOutputStream(ZipFile))
                {
                    ZipSetp(strDirectory, s, "");
                }
            }
        }

        /// <summary>
        /// 递归遍历目录
        /// </summary>
        /// <param name="strDirectory">The directory</param>
        /// <param name="s">The ZipOutputStream Object</param>
        /// <param name="parentPath">The parent path</param>
        public 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 strPath = parentPath;
                    strPath += file.Substring(file.LastIndexOf("\\") + 1);
                    strPath += "\\";
                    ZipSetp(file, s, strPath);
                }
                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();

                        entry.DateTime = DateTime.Now;
                        entry.Size = fs.Length;

                        fs.Close();

                        crc.Reset();
                        crc.Update(buffer);

                        entry.Crc = crc.Value;
                        s.PutNextEntry(entry);

                        s.Write(buffer, 0, buffer.Length);
                    }
                }
            }
        }

        /// <summary>
        /// 解压一个zip文件
        /// eg:ZipHelper.UnZip("上传路径","保存路径","",true)
        /// </summary>
        /// <param name="zipedFile">The ziped file</param>
        /// <param name="strDirectory">The STR directory</param>
        /// <param name="password">zip 文件密码</param>
        /// <param name="overWirte">是否覆盖已存在的文件</param>
        public static void UnZip(string zipedFile, string strDirectory, string password, bool overWirte)
        {
            if (strDirectory=="")
                strDirectory = Directory.GetCurrentDirectory();
            if (!strDirectory.EndsWith("\\"))
                strDirectory = strDirectory + "\\";

            using (ZipOutputStream s=new ZipOutputStream(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)&& overWirte)|| (!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();
            }
        }
    }
}
时间: 2024-10-28 16:22:25

解压缩文件的相关文章

Java实现压缩文件与解压缩文件

由于工作需要,需要将zip的压缩文件进行解压,经过调查发现,存在两个开源的工具包,一个是Apache的ant工具包,另一个就是Java api自带的工具包:但是Java自带的工具包存在问题:如果压缩或者解压的文件存在非英文字符(比如中文.以色列文),在操作的过程中会存在问题:MALFORMAL Eception-- 以下是通过Apache的zip工具包进行压缩和解压的代码(需要ant.jar): package com.steven.file; import java.io.File; impo

Ubuntu中的解压缩文件的方式

记录Ubuntu下各种压缩和解压方式: .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --------------- .gz 解压1:gunzip FileName.gz 解压2:gzip -d FileName.gz 压缩:gzip FileName .tar.gz 解压:tar zxvf FileName.tar.gz 压缩:tar zcvf FileName.tar.gz DirN

CentOS7,使用tar命令解压缩文件

我们经常会遇到打包成.gz格式的压缩包,这种包不是可执行自动安装包,这种包相当于是个zip包,其安装过程就是手动解压缩.编辑配置文件.配置环境变量的过程.通过以下命令可以加压缩一个gz文件: tar zxvf <.gzfile> <.gzfile>是指你需要解压缩的那个文件. 参数说明: z - 过滤gzip文件,即只能解压缩指定的gz格式文件. x - 解压缩(tar还能进行压缩包查看和打包,所以如果需要解压缩文件包,需要在命令行中指定x) v - 以详细模式显示出解压缩的过程.

C#压缩、解压缩文件(夹)(rar、zip)

主要是使用Rar.exe压缩解压文件(夹)(*.rar),另外还有使用SevenZipSharp.dll.zLib1.dll.7z.dll压缩解压文件(夹)(*.zip).需要注意的几点如下: 1.注意Rar.exe软件存放的位置,此次放在了Debug目录下 2.SevenZipSharp.dll.zLib1.dll.7z.dll必须同时存在,否则常报“加载7z.dll错误”,项目引用时,只引用SevenZipSharp.dll即可 3.另外找不到7z.dll文件也会报错,测试时发现只用@"..

Unity3d通用工具类之解压缩文件

今天,我们来写写c#是如何通过代码解压缩文件的. 在游戏的项目中呢,常常我们需要运用到解压缩的技术.比如,当游戏需要更新的时候,我们会从服务器中下载更新的压缩文件包. 这时候我们就需要解压文件,然后覆盖添加到游戏文件夹去,实现游戏的更新. 通常我们就需要通过代码来实现这一功能. 那么这里呢,我用的是第三发的压缩库,这个是用到一个dll,也就是ICSharpCode.SharpZipLib.Zip.dll 读者可以自行百度下载,这里我提供链接给你们: http://pan.baidu.com/s/

PHP解压缩文件函数详解

欲使用本函数库需先安装 zlib,可到 http://www.zlib.net/ 取得该函数库. ) zclose: 关闭压缩文件. gzeof: 判断是否在压缩文件尾. gzfile: 读压缩文件到数组中. gzgetc: 读压缩文件中的字符. gzgets: 读压缩文件中的字符串. gzgetss: 读压缩文件中的字符串,并去掉 HTML 指令. gzopen: 打开压缩文件. gzpassthru: 解压缩指针后全部资料. gzputs: 资料写入压缩文件. gzread: 压缩文件读出指

Linux解压缩文件

Linux下自带了一个unzip的程序可以解压缩文件, 解压命令是:unzip filename.zip 同样也提供了一个zip程序压缩zip文件,命令是 zip filename.zip files 会将files压缩到filename.zip 另外看看文件的后缀名,不同的后缀的文件解压和压缩的命令都不一样 总结一下 1.*.tar 用 tar –xvf 解压 2.*.gz 用 gzip -d或者gunzip 解压 3.*.tar.gz和*.tgz 用 tar –xzf 解压 4.*.bz2 

用命令提示符压缩文件,解压缩文件(不需要客户端安装7zip)

压缩成一个CAB包的办法: type list.txt (生成一个文件列表) makecab /f list.txt /d compressiontype=mszip /d compressionmemory=21 /d maxdisksize=1024000000 /d diskdirectorytemplate=dd* /d cabinetnametemplate=dd*.cab 来个高压缩比的.呵 makecab /f list.txt /d compressiontype=lzx /d

使用zip/unzip压缩、解压缩文件

今天项目升级模块中有需要进行解压缩操作,本来打算使用创建进程调用winrar工具的方式来解压,在VS2008环境下也是能跑通的,但是因为产品升级程序是以windows服务的方式运行的,使用这个方式怎么都行不通,进程能正常退出,但是就是解压不出来,进程管理器中也显示winrar进程没有退出,可能导致解压后的文件未释放,至于具体原因,暂时还未明了,希望有经验的朋友指点一下!但是项目还得继续做啊,因此只能换其他方式了. 通过在网上查找资料,找到了这个东东,http://www.codeproject.

linux服务器解压缩文件的命令

尝试去好好用linux.新手起步.   这边只会提到我用过的.其他相关的以后我用到了我会补充的.如果有错欢迎指正 注:1.c-创建-create 2.v-复杂输出    3.f-文件-file       4.x-解压-extract       5.z-gz格式 66666.真不会用语法的就使用man...例如  man tar  他就会给你现实tar的一些参数操作        .tar 打包语法:tar cvf newFileName.tar fileName || dirName 解包语