文件的压缩与解压

        #region[解压文件]
        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="zipFileName">zip文件路径+zip文件名称</param>
        /// <param name="targetDirectory">解压后文件保存路径</param>
        /// <param name="fileFilter">解压zip文件中指定文件,若为null,则对解压后的文件不做筛选</param>
        /// <returns></returns>
        public static Boolean ExtractZip(string zipFileName, string targetDirectory, string fileFilter)
        {
            try
            {
                //FastZip 添加引用 ICSharpCode.SharpZipLib.Zip;
                FastZip fastZip = new FastZip();
                fastZip.ExtractZip(zipFileName, targetDirectory, fileFilter);
                return true;
            }
            catch
            {
                return false;
            }
        }

        //解压zip文件中某个指定文件
        public void DeCompressOne()
        {
            string zipFileName = @"E:\20190903\测试文件\测试.zip";//zip文件路径+zip文件名
            string subPath = @"E:\20190903\非zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss");
            string fileFilter = "测试.txt";
            System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存解压后的文件
            string targetDirectory = subPath;//解压后文件保存路径
            Boolean bl = ExtractZip(zipFileName, targetDirectory, fileFilter);
        }

        // 解压zip文件
        protected void DeCompress()
        {
            string zipFileName = @"E:\20190903\测试文件\测试.zip";//zip文件路径+zip文件名
            string subPath = @"E:\20190903\非zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss");
            System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存解压后的文件
            string targetDirectory = subPath;//解压后文件保存路径
            Boolean bl = ExtractZip(zipFileName, targetDirectory, null);
        }

        #endregion

        #region[压缩文件]
        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="zipFileName">zip文件保存路径+zip文件名称</param>
        /// <param name="sourceDirectory">压缩来源文件路径</param>
        /// <param name="recurse"></param>
        /// <param name="fileFilter">压缩文件夹中指定文件,若为null,则压缩文件夹中所有的文件</param>
        /// <returns></returns>
        public static Boolean CreateZip(string zipFileName, string sourceDirectory, bool recurse, string fileFilter)
        {
            try
            {
                //FastZip 添加引用 ICSharpCode.SharpZipLib.Zip;
                FastZip fastZip = new FastZip();
                fastZip.CreateZip(zipFileName, sourceDirectory, recurse, fileFilter);
                return true;
            }
            catch
            {
                return false;
            }
        }

        //压缩一个文件
        protected void CompressOne()
        {
            string subPath = @"E:\20190903\zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss");
            System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存压缩后的文件
            string zipFileName = subPath + @"\测试.zip";//压缩文件路径+压缩文件名(压缩文件名可以自定义)
            string sourceDirectory = @"E:\20190903\测试文件\";
            string fileFilter = @"测试.txt";
            Boolean bl = CreateZip(zipFileName, sourceDirectory, false, fileFilter);
        }

        // 压缩一个文件夹
        protected void Compress()
        {
            string subPath = @"E:\20190903\zip文件\" + DateTime.Now.ToString("yyyyMMddhhmmss");
            System.IO.Directory.CreateDirectory(subPath);//创建文件夹,保存压缩后的文件
            string zipFileName = subPath + @"\测试.zip";//压缩文件路径+压缩文件名(压缩文件名可以自定义)
            string sourceDirectory = @"E:\20190903\测试文件\";
            Boolean bl = CreateZip(zipFileName, sourceDirectory, true, null);
        }
        #endregion

        #region[文件流的解压与压缩]

        #region[Way1]
        public static void Way1()
        {
            //压缩文件流
            string str = "文件流的压缩与解压相关代码";
            //使用FileStream 要添加引用  System.IO;
            FileStream fs = File.OpenWrite(@"E:\20190903\测试文件\内存流处理.txt");//  打开一个现有文件或创建一个新文件以进行写入。(用于保存压缩的byte数组)
            //使用GZipStream 要添加引用 System.IO.Compression;  (GZipStream 提供用于压缩和解压缩流的方法和属性。提供用于压缩和解压缩流的方法和属性。)
            GZipStream zipStream = new GZipStream(fs, CompressionMode.Compress);//CompressionMode.Compress:将压缩的基础流。
            //使用Encoding 要添加引用:System.Text
            byte[] bytes = Encoding.UTF8.GetBytes(str);
            zipStream.Write(bytes, 0, bytes.Length);//从指定的字节数组中将压缩的字节写入基础流。
            zipStream.Close();
            fs.Close();

            //解压文件流
            FileStream fs2 = File.OpenRead(@"E:\20190903\测试文件\内存流处理.txt");//打开现有文件以进行读取。(txt文件保存的是byte数组)
            GZipStream zipStream2 = new GZipStream(fs2, CompressionMode.Decompress);//CompressionMode.Decompress:解压缩基础流。
            FileStream fs3 = File.OpenWrite(@"E:\20190903\测试文件\内存流处理2.txt");//  打开一个现有文件或创建一个新文件以进行写入。(用于保存压缩的byte数组)
            int bytesRead;
            while ((bytesRead = zipStream2.Read(bytes, 0, bytes.Length)) > 0) //将若干解压缩的字节读入指定的字节数组。
            {
                fs3.Write(bytes, 0, bytesRead);
            }
            fs3.Close();
            zipStream2.Close();
            fs2.Close();
        }
        #endregion

        #region[Way2]
        public  static void Way2()
        {
            //压缩文件流(使用using(){} 关闭和释放不需要手动操作)
            string str = "文件流的压缩与解压相关代码2";
            using (FileStream fs = File.OpenWrite(@"E:\20190903\测试文件\内存流处理.txt"))
            {
                using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Compress))
                {
                    byte[] bytes = Encoding.UTF8.GetBytes(str);
                    zipStream.Write(bytes, 0, bytes.Length);
                }
            }

            //解压文件流(使用using(){} 关闭和释放不需要手动操作)
            using (FileStream fs = File.OpenRead(@"E:\20190903\测试文件\内存流处理.txt"))
            {
                using (GZipStream zipStream = new GZipStream(fs, CompressionMode.Decompress))
                {
                    using (FileStream fs1 = File.OpenWrite(@"E:\20190903\测试文件\内存流处理2.txt"))
                    {
                        int bytesRead;
                        byte[] bytes = new byte[1024];
                        while ((bytesRead = zipStream.Read(bytes, 0, bytes.Length)) > 0)
                        {
                            fs1.Write(bytes, 0, bytesRead);
                        }
                    }
                }
            }

        }
        #endregion

        #region[Way3]
        public static void Way3()
        {
            string testdata = "GZip压缩和解压";

            //压缩
            byte[] gzipdata = CompressGZip(Encoding.UTF8.GetBytes(testdata));

            //解压
            byte[] undata = UnGZip(gzipdata);
            var pp = Encoding.UTF8.GetString(undata);
        }

        //压缩文件
        public static byte[] CompressGZip(byte[] rawData)
        {
            //MemoryStream需要添加引用  System.IO;
            MemoryStream ms = new MemoryStream();
            //GZipOutputStream要添加引用  ICSharpCode.SharpZipLib.GZip
            GZipOutputStream compressedzipStream = new GZipOutputStream(ms);
            compressedzipStream.Write(rawData, 0, rawData.Length);
            compressedzipStream.Close();
            return ms.ToArray();
        }

        //解压文件
        public static byte[] UnGZip(byte[] byteArray)
        {
            //MemoryStream需要添加引用  System.IO;
            MemoryStream re = new MemoryStream();
            //GZipOutputStream要添加引用  ICSharpCode.SharpZipLib.GZip
            GZipInputStream gzi = new GZipInputStream(new MemoryStream(byteArray));
            int count;
            byte[] data = new byte[1024];
            while ((count = gzi.Read(data, 0, data.Length)) != 0)
            {
                re.Write(data, 0, count);
            }
            byte[] overarr = re.ToArray();
            return overarr;
        }
        #endregion
        #endregion

  

posted @ 2019-09-16 14:04  EnjoyToday  阅读(352)  评论(0编辑  收藏  举报