C# 文件压缩与解压缩

来源:互联网 发布:淘宝平台怎么赚钱 编辑:程序博客网 时间:2024/04/29 22:27

工具:ZipTool.exe

源码:ZipTool_src.zip

文件压缩、解压处理类,ZipTool.cs

using ICSharpCode.SharpZipLib.Zip;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Tools{    /// <summary>    /// 文件压缩zip()、解压缩unzip()    /// </summary>    public class ZipTool    {        /// <summary>        /// 根据给的文件参数,自动进行压缩或解压缩操作        /// </summary>        public static void Process(String[] files, String Password = null)        {            if (files.Length > 0)            {                if (files.Length == 1 && (files[0].ToLower().EndsWith(".zip") || files[0].ToLower().EndsWith(".rar")))                {                    unzip(files[0], null, Password, null);                  // 解压缩                }                else                {                    String zipPath = Tools.getPathNoExt(files[0]) + ".zip";// 以待压缩的第一个文件命名生成的压缩文件                    String BaseDir = Tools.getParent(files[0]);// 获取第一个文件的父路径信息                    if (files.Length == 1)// 若载入的为单个目录,则已当前目录作为基础路径                    {                        String file = files[0];                        if (Directory.Exists(file)) BaseDir = file + "\\";                    }                    String[] subFiles = Tools.getSubFiles(files);// 获取args对应的所有目录下的文件列表                    zip(zipPath, BaseDir, subFiles, Password, null);// 对载入的文件进行压缩操作                }            }        }        /// <summary>        /// 压缩所有文件files为zip        /// </summary>        public static bool zipFiles(String[] files, String Password = null, String[] ignoreNames = null)        {            return zip(null, null, files, Password, ignoreNames);        }        /// <summary>        /// 压缩指定的文件或文件夹为zip        /// </summary>        public static bool zip(String file, String Password = null, String[] ignoreNames = null)        {            return zip(null, null, new String[] { file }, Password, ignoreNames);        }        /// <summary>        /// 判断fileName中是否含有ignoreNames中的某一项        /// </summary>        private static bool ContainsIgnoreName(String fileName, String[] ignoreNames)        {            if (ignoreNames != null && ignoreNames.Length > 0)            {                foreach (string name in ignoreNames)                {                    if (fileName.Contains(name)) return true;                }            }            return false;        }        /// <summary>        /// 压缩所有文件files,为压缩文件zipFile, 以相对于BaseDir的路径构建压缩文件子目录,ignoreNames指定要忽略的文件或目录        /// </summary>        public static bool zip(String zipPath, String BaseDir, String[] files, String Password = null, String[] ignoreNames = null)        {            if (files == null || files.Length == 0) return false;            if (zipPath == null || zipPath.Equals("")) zipPath = Tools.getPathNoExt(files[0]) + ".zip";// 默认以第一个文件命名压缩文件            if (BaseDir == null || BaseDir.Equals("")) BaseDir = Tools.getParent(files[0]);// 默认以第一个文件的父目录作为基础路径            Console.WriteLine("所有待压缩文件根目录:" + BaseDir);            try            {                Tools.mkdirs(Tools.getParent(zipPath));         // 创建目标路径                Console.WriteLine("创建压缩文件:" + zipPath);                FileStream input = null;                ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipPath));                if (Password != null && !Password.Equals("")) zipStream.Password = Password;                files = Tools.getSubFiles(files);               // 获取子目录下所有文件信息                for (int i = 0; i < files.Length; i++)                {                    if (ContainsIgnoreName(files[i], ignoreNames)) continue;    // 跳过忽略的文件或目录                    String entryName = Tools.relativePath(BaseDir, files[i]);                    zipStream.PutNextEntry(new ZipEntry(entryName));                    Console.WriteLine("添加压缩文件:" + entryName);                    if (File.Exists(files[i]))                  // 读取文件内容                    {                        input = File.OpenRead(files[i]);                        Random rand = new Random();                        byte[] buffer = new byte[10240];                        int read = 0;                        while ((read = input.Read(buffer, 0, 10240)) > 0)                        {                            zipStream.Write(buffer, 0, read);                        }                        input.Close();                    }                }                zipStream.Close();                Console.WriteLine("文件压缩完成!");                return true;            }            catch (Exception ex)            {                Console.WriteLine(ex.ToString());            }            return false;        }        /// <summary>        /// 解压文件 到指定的路径,可通过targeFileNames指定解压特定的文件        /// </summary>        public static bool unzip(String zipPath, String targetPath = null, String Password = null, String[] targeFileNames = null)        {            if (File.Exists(zipPath))            {                if (targetPath == null || targetPath.Equals("")) targetPath = Tools.getPathNoExt(zipPath);                Console.WriteLine("解压文件:" + zipPath);                Console.WriteLine("解压至目录:" + targetPath);                try                {                    ZipInputStream zipStream = null;                    FileStream bos = null;                    zipStream = new ZipInputStream(File.OpenRead(zipPath));                    if (Password != null && !Password.Equals("")) zipStream.Password = Password;                    ZipEntry entry = null;                    while ((entry = zipStream.GetNextEntry()) != null)                    {                        if (targeFileNames != null && targeFileNames.Length > 0)                // 若指定了目标解压文件                        {                            if (!ContainsIgnoreName(entry.Name, targeFileNames)) continue;      // 跳过非指定的文件                        }                        String target = targetPath + "\\" + entry.Name;                        if (entry.IsDirectory) Tools.mkdirs(target); // 创建目标路径                        if (entry.IsFile)                        {                            Tools.mkdirs(Tools.getParent(target));                            bos = File.Create(target);                            Console.WriteLine("解压生成文件:" + target);                            int read = 0;                            byte[] buffer = new byte[10240];                            while ((read = zipStream.Read(buffer, 0, 10240)) > 0)                            {                                bos.Write(buffer, 0, read);                            }                            bos.Flush();                            bos.Close();                        }                    }                    zipStream.CloseEntry();                    Console.WriteLine("解压完成!");                    return true;                }                catch (Exception ex)                {                    Console.WriteLine(ex.ToString()); ;                }            }            return false;        }    }}
Tools.cs:

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Tools{    /// <summary>    /// 通用功能函数    /// </summary>    public class Tools    {        /// <summary>        /// 检测目录是否存在,若不存在则创建        /// </summary>        public static void mkdirs(string path)        {            if (!Directory.Exists(path))            {                Directory.CreateDirectory(path);            }        }        /// <summary>        /// 获取去除拓展名的文件路径        /// </summary>        public static String getPathNoExt(String path)        {            if (File.Exists(path)) return Directory.GetParent(path).FullName + "\\" + Path.GetFileNameWithoutExtension(path);            else return Directory.GetParent(path).FullName + "\\" + Path.GetFileName(path);        }        /// <summary>        /// 获取父目录的路径信息        /// </summary>        public static String getParent(String path)        {            return System.IO.Directory.GetParent(path).FullName + "\\";        }        /// <summary>        /// 获取父目录的路径信息        /// </summary>        public static String getFileName(String path)        {            return System.IO.Path.GetFileName(path);        }        /// <summary>        /// 获取filePath的相对于BaseDir的路径        /// </summary>        public static String relativePath(String BaseDir, String filePath)        {            String relativePath = "";            if (filePath.StartsWith(BaseDir)) relativePath = filePath.Substring(BaseDir.Length);            return relativePath;        }        //-----------------------------------------------------------------------------------------        /// <summary>        /// 获取paths路径下所有文件信息        /// </summary>        public static String[] getSubFiles(String[] Paths)        {            List<String> list = new List<String>();        // paths路径下所有文件信息            foreach (String path in Paths)            {                List<String> subFiles = getSubFiles(path);// 获取路径path下所有文件列表信息                list = ListAdd(list, subFiles);            }            String[] A = List2Array(list);// 转化为数组形式            return A;        }        /// <summary>        /// 合并list1和list2到新的list        /// </summary>        public static List<String> ListAdd(List<String> list1, List<String> list2)        {            List<String> list = new List<String>();            foreach (String path in list1) if (!list.Contains(path)) list.Add(path);            foreach (String path in list2) if (!list.Contains(path)) list.Add(path);            return list;        }        /// <summary>        /// 获取file目录下所有文件列表        /// </summary>        public static List<String> getSubFiles(String file)        {            List<String> list = new List<String>();            if (File.Exists(file))            {                if (!list.Contains(file)) list.Add(file);            }            if (Directory.Exists(file))            {                // 获取目录下的文件信息                foreach (String iteam in Directory.GetFiles(file))                {                    if (!list.Contains(iteam)) list.Add(iteam);                }                // 获取目录下的子目录信息                foreach (String iteam in Directory.GetDirectories(file))                {                    List<String> L = getSubFiles(iteam);// 获取子目录下所有文件列表                    foreach (String path in L)                    {                        if (!list.Contains(path)) list.Add(path);                    }                }                // 记录当前目录                if (Directory.GetFiles(file).Length == 0 && Directory.GetDirectories(file).Length == 0)                {                    if (!list.Contains(file)) list.Add(file + "\\");                }            }            return list;        }        /// <summary>        /// 转化list为数组        /// </summary>        public static String[] List2Array(List<String> list)        {            int size = (list == null ? 0 : list.Count);            String[] A = new String[size];            int i = 0;            foreach (String S in list)            {                A[i++] = S;            }            return A;        }    }}
Program.cs:

using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Reflection;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using ZipTool.Properties;namespace ZipTool{    static class Program    {        /// <summary>        /// 应用程序的主入口点。拖动待压缩或解压的文件至此应用,即可进行压缩或解压。\r\n通过cmd调用时,传参数PASS:***可指定密码        /// </summary>        [STAThread]        static void Main(string[] args)        {            if (args != null && args.Length > 0)            {                Depends.Export(args);   // 解压依赖dll                AnalyseArgs(args);      // 解析参数信息                process(Args, Password);// 执行压缩解压            }            else MessageBox.Show("拖动待压缩或解压的文件至此应用,即可进行压缩或解压。\r\n通过cmd调用时,传参数PASS:***可指定密码!");        }        /// <summary>        /// 执行压缩解压逻辑        /// </summary>        private static void process(string[] args, string password)        {            // 执行逻辑            if (args != null && args.Length > 0)            {                // 进行压缩、解压                Tools.ZipTool.Process(Args, Password);                //// 删除临时文件                //deletFile("ICSharpCode.SharpZipLib.dll");                //deletFile("Tools.dll");                string[] files = new string[] { "ICSharpCode.SharpZipLib.dll", "Tools.dll" };                AutoDelet.deletFiles(files);            }        }        private static string Password = null;  // 压缩解压密码        private static string[] Args = null;    // 其他参数        /// <summary>        /// 解析应用参数信息        /// </summary>        private static void AnalyseArgs(string[] args)        {            // 解析参数信息            List<string> argList = new List<string>();            if (args != null && args.Length > 0)            {                foreach (string arg0 in args)                {                    string arg = arg0.Trim();                    if (arg.StartsWith("PASS:")) Password = arg.Substring("PASS:".Length);                    else argList.Add(arg);                }            }            Args = argList.ToArray();        }    }    public class Depends    {        /// <summary>        /// 解压依赖dll,后重启应用        /// </summary>        public static void Export(string[] args)        {            if (args != null && args.Length > 0)            {                string ZipLib = curDir() + "ICSharpCode.SharpZipLib.dll";                string Tool = curDir() + "Tools.dll";                if (!File.Exists(ZipLib) || !File.Exists(Tool))                {                    if (!File.Exists(ZipLib)) SaveFile(Resources.ICSharpCode_SharpZipLib, ZipLib);                    if (!File.Exists(Tool)) SaveFile(Resources.Tools, Tool);                    //string Arg = ComBineArgs(args);                    //System.Diagnostics.Process.Start(curExecutablePath(), Arg);                    //System.Environment.Exit(0); //退出                }            }        }        /// <summary>        /// 合并参数为单个串        /// </summary>        private static string ComBineArgs(string[] args)        {            string str = "";            foreach (string arg0 in args)            {                string arg = arg0.Trim().Trim('"');                str += " \"" + arg + "\"";            }            return str.Substring(1);        }        /// <summary>        /// 获取当前运行路径        /// </summary>        public static string curDir()        {            return AppDomain.CurrentDomain.BaseDirectory;        }        /// <summary>        /// 获取当前运行Exe的路径        /// </summary>        public static string curExecutablePath()        {            return System.Windows.Forms.Application.ExecutablePath;        }        /// <summary>        /// 保存Byte数组为文件        /// </summary>        public static void SaveFile(Byte[] array, string path, bool repalce = false)        {            if (repalce && File.Exists(path)) File.Delete(path);    // 若目标文件存在,则替换            if (!File.Exists(path))            {                // 创建输出路径                String dir = Path.GetDirectoryName(path);                // 创建输出流                FileStream fs = new FileStream(path, FileMode.Create);                //将byte数组写入文件中                fs.Write(array, 0, array.Length);                fs.Close();            }        }        ///// <summary>        ///// 删除文件        ///// </summary>        //public static void deletFile(string Name)        //{        //    string path = AppDomain.CurrentDomain.BaseDirectory + Name;        //    if (File.Exists(path)) File.Delete(path);        //}    }    public class AutoDelet    {        /// <summary>        /// 删除文件        /// </summary>        public static void deletFiles(string[] Names)        {            try            {                //Set ws = CreateObject("Wscript.Shell")                 //WScript.sleep 5000                //ws.run "cmd /c ?> $",vbhide                //ws.run "cmd /c del $",vbhide                //ws.run "cmd /c ?> $.vbs",vbhide                //ws.run "cmd /c del $.vbs",vbhide                string vbsName = "Clear.vbs";                StringBuilder Str = new StringBuilder();                Str.AppendLine("Set ws = CreateObject(\"Wscript.Shell\")");                Str.AppendLine("WScript.sleep 1000");                Str.AppendLine("ws.run \"cmd /c del " + vbsName + "\",vbhide");                string dir = AppDomain.CurrentDomain.BaseDirectory;                foreach (string name in Names)                {                    if (File.Exists(dir + name)) Str.AppendLine("ws.run \"cmd /c del " + name + "\",vbhide");                }                string data = Str.ToString();                SaveFile(data, dir + vbsName);                System.Diagnostics.Process.Start(dir + vbsName);                System.Environment.Exit(0); //退出            }            catch (Exception) { }        }        /// <summary>          /// 保存数据data到文件处理过程,返回值为保存的文件名          /// </summary>          private static String SaveFile(String data, String filePath)        {            System.IO.StreamWriter file1 = new System.IO.StreamWriter(filePath, false, Encoding.Default);     //文件已覆盖方式添加内容              file1.Write(data);                                                              //保存数据到文件              file1.Close();                                                                  //关闭文件              file1.Dispose();                                                                //释放对象              return filePath;        }    }}