C# 压缩和解压文件

来源:互联网 发布:按键精灵淘宝秒杀脚本 编辑:程序博客网 时间:2024/05/20 12:24

下载dll:ICSharpCode.SharpZipLib.dll

 public static class FileHelper    {        public static void ZipFileDirectory(string strDirectory, string zipedFile)        {            using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))            {                using (ZipOutputStream s = new ZipOutputStream(ZipFile))                {                    try                    {                                               ZipSetp(strDirectory, s, "");                    }                    catch (Exception ex)                    {                    }                }            }        }        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 zipName = strDirectory.Split(new string[] { "\\", "/" }, StringSplitOptions.RemoveEmptyEntries).Last()+".zip";            string[] filenames = Directory.GetFileSystemEntries(strDirectory);            foreach (string file in filenames)// 遍历所有的文件和目录            {                if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件                {                    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);                        s.Write(buffer, 0, buffer.Length);                    }                }            }        }    }



 public static void UnZipFile(string zipFilePath, string targetPath)        {            if (!File.Exists(zipFilePath))            {                Console.WriteLine("Cannot find file '{0}'", zipFilePath);                return;            }            if (!Directory.Exists(targetPath))            {                Directory.CreateDirectory(targetPath);            }            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))            {                ZipEntry theEntry;                while ((theEntry = s.GetNextEntry()) != null)                {                    Console.WriteLine(theEntry.Name);                    string directoryName = Path.GetDirectoryName(theEntry.Name);                    string fileName = Path.GetFileName(theEntry.Name);                    // create directory                    if (directoryName.Length > 0)                    {                        directoryName = Path.Combine(targetPath, directoryName);                        if (!Directory.Exists(directoryName))                        {                            Directory.CreateDirectory(directoryName);                        }                    }                    if (fileName != String.Empty)                    {                        using (FileStream streamWriter = new FileStream(Path.Combine(directoryName, fileName),FileMode.CreateNew,FileAccess.Write))                        {                            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;                                }                            }                        }                    }                }            }        }



0 0