• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    asp.net C#实现解压缩文件的方法

    本文实例讲述了asp.net C#实现解压缩文件的方法。一共给大家介绍了三段代码,一个是简单的解压缩单个zip文件,后一个可以解压批量的大量的但需要调用ICSharpCode.SharpZipLib.dll类了,最后一个比较实例可压缩也可以解压缩了分享给大家供大家参考。具体如下:

    解压缩单个文件:

    复制代码 代码如下:
    using System.IO;
    using System.IO.Compression;
    string sourceFile=@"D:2.zip";
    string destinationFile=@"D:1.txt";
            private const long BUFFER_SIZE = 20480;
                // make sure the source file is there
                if (File.Exists ( sourceFile ))
                {
                FileStream sourceStream = null;
                FileStream destinationStream = null;
                GZipStream decompressedStream = null;
                byte[] quartetBuffer = null;
                try
                {
                    // Read in the compressed source stream
                    sourceStream = new FileStream ( sourceFile, FileMode.Open );
                    // Create a compression stream pointing to the destiantion stream
                    decompressedStream = new DeflateStream ( sourceStream, CompressionMode.Decompress, true );
                    // Read the footer to determine the length of the destiantion file
                    quartetBuffer = new byte[4];
                    int position = (int)sourceStream.Length - 4;
                    sourceStream.Position = position;
                    sourceStream.Read ( quartetBuffer, 0, 4 );
                    sourceStream.Position = 0;
                    int checkLength = BitConverter.ToInt32 ( quartetBuffer, 0 );
                    byte[] buffer = new byte[checkLength + 100];
                    int offset = 0;
                    int total = 0;
                    // Read the compressed data into the buffer
                    while ( true )
                    {
                        int bytesRead = decompressedStream.Read ( buffer, offset, 100 );
                        if ( bytesRead == 0 )
                            break;
                        offset += bytesRead;
                        total += bytesRead;
                    }
                    // Now write everything to the destination file
                    destinationStream = new FileStream ( destinationFile, FileMode.Create );
                    destinationStream.Write ( buffer, 0, total );
                    // and flush everyhting to clean out the buffer
                    destinationStream.Flush ( );
                }
                catch ( ApplicationException ex )
                {
                    Console.WriteLine(ex.Message, "解压文件时发生错误:");
                }
                finally
                {
                    // Make sure we allways close all streams
                    if ( sourceStream != null )
                        sourceStream.Close ( );
                    if ( decompressedStream != null )
                        decompressedStream.Close ( );
                    if ( destinationStream != null )
                        destinationStream.Close ( );
                }
    }

    批量解压缩(这需要调用一个解压缩类库。。 ICSharpCode.SharpZipLib.dll)

    复制代码 代码如下:
    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Text;
    using ICSharpCode.SharpZipLib.Zip;
    namespace ZipLib
    {
        /// summary>
        /// 解压缩类
        /// /summary>
       public static class ZIP
        {
            /// summary>
            /// 解压ZIP文件包
            /// /summary>
            /// param name="strZipFile">ZIP文件路径/param>
            /// param name="strDir">解压后的文件目录路径/param>
            /// returns>是否解压成功/returns>
            public static bool unzipFiles(string strZipFile, string strDir)
            {
                //判断ZIP文件是否存在
                if (File.Exists(strZipFile))
                {
                    //判断目录是否存在
                    bool bUnzipDir = false;
                    //判断是否需要创建目录
                    if (!Directory.Exists(strDir))
                        bUnzipDir = (Directory.CreateDirectory(strDir) != null);
                    else
                        bUnzipDir = true;
                    //如果解压目录存在
                    if (bUnzipDir)
                    {
                        //获得ZIP数据流
                        ZipInputStream zipStream = new ZipInputStream(File.OpenRead(strZipFile));
                        if (zipStream != null)
                        {
                            ZipEntry zipEntry = null;
                            while ((zipEntry = zipStream.GetNextEntry()) != null)
                            {
                                string strUnzipFile = strDir + "//" + zipEntry.Name;
                                string strFileName = Path.GetFileName(strUnzipFile);
                                string strDirName = Path.GetDirectoryName(strUnzipFile);
                                //是否为解压目录
                                if (!string.IsNullOrEmpty(strDirName))
                                    Directory.CreateDirectory(strDirName);
                                //是否为解压文件
                                if (!string.IsNullOrEmpty(strFileName))
                                {
                                    //解压文件
                                    FileStream unzipFileStream = new FileStream(strUnzipFile, FileMode.Create);
                                    if (unzipFileStream != null)
                                    {
                                        byte[] buf = new byte[2048];
                                        int size = 0;
                                        while ((size = zipStream.Read(buf, 0, 2048)) > 0)
                                            unzipFileStream.Write(buf, 0, size);
                                        //关闭Stream
                                        unzipFileStream.Flush();
                                        unzipFileStream.Close();
                                    }
                                }
                            }
                            //关闭ZIP流
                            zipStream.Close();
                            //返回值
                            return true;
                        }
                    }
                }
                return false;
            }
        }
    }

    上面两个都是解压缩文件,下面我们把压缩与解压缩放在一个实例中。
    最近要做一个项目涉及到C#中压缩与解压缩的问题的解决方法,大家分享。
    这里主要解决文件夹包含文件夹的解压缩问题。

    下载SharpZipLib.dll,在http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx中有最新免费版本,“Assemblies for .NET 1.1, .NET 2.0, .NET CF 1.0, .NET CF 2.0: Download [297 KB] ”点击Download可以下载,解压后里边有好多文件夹,因为不同的版本,我用的FW2.0。
    或者点击此处本站下载。

    引用SharpZipLib.dll,在项目中点击项目右键-->添加引用-->浏览,找到要添加的DLL-->确认

    改写了文件压缩和解压缩的两个类,新建两个类名字为ZipFloClass.cs,UnZipFloClass.cs
    源码如下

    复制代码 代码如下:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.IO;
    using ICSharpCode.SharpZipLib.Checksums;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.GZip;
    /// summary>
    /// ZipFloClass 的摘要说明
    /// /summary>
    public class ZipFloClass
    {
        public void ZipFile(string strFile, string strZip)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                strFile += Path.DirectorySeparatorChar;
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            zip(strFile, s, strFile);
            s.Finish();
            s.Close();
        }

        private void zip(string strFile, ZipOutputStream s, string staticFile)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
            Crc32 crc = new Crc32();
            string[] filenames = Directory.GetFileSystemEntries(strFile);
            foreach (string file in filenames)
            {
                if (Directory.Exists(file))
                {
                    zip(file, s, staticFile);
                }
                else // 否则直接压缩文件
                {
                    //打开压缩文件
                    FileStream fs = File.OpenRead(file);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1);
                    ZipEntry entry = new ZipEntry(tempfile);
                    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);
                }
            }
        }
    }

    复制代码 代码如下:
    using System;
    using System.Data;
    using System.Web;
    using System.Text;
    using System.Collections;
    using System.IO;
    using System.Diagnostics;
    using System.Runtime.Serialization.Formatters.Binary;
    using ICSharpCode.SharpZipLib.BZip2;
    using ICSharpCode.SharpZipLib.Zip;
    using ICSharpCode.SharpZipLib.Zip.Compression;
    using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
    using ICSharpCode.SharpZipLib.GZip;
    using ICSharpCode.SharpZipLib.Checksums;

    /// summary>
    /// UnZipFloClass 的摘要说明
    /// /summary>
    public class UnZipFloClass
    {
        public string unZipFile(string TargetFile, string fileDir)
        {
            string rootFile = " ";
            try
            {
                //读取压缩文件(zip文件),准备解压缩
                ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
                ZipEntry theEntry;
                string path = fileDir;                  
                //解压出来的文件保存的路径
                string rootDir = " ";                       
                //根目录下的第一个子文件夹的名称
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    rootDir = Path.GetDirectoryName(theEntry.Name);                         
                    //得到根目录下的第一级子文件夹的名称
                    if (rootDir.IndexOf("\") >= 0)
                    {
                        rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1);
                    }
                    string dir = Path.GetDirectoryName(theEntry.Name);                   
                    //根目录下的第一级子文件夹的下的文件夹的名称
                    string fileName = Path.GetFileName(theEntry.Name);                   
                    //根目录下的文件名称
                    if (dir != " " )                                                       
                        //创建根目录下的子文件夹,不限制级别
                    {
                        if (!Directory.Exists(fileDir + "\" + dir))
                        {
                            path = fileDir + "\" + dir;                                               
                            //在指定的路径创建文件夹
                            Directory.CreateDirectory(path);
                        }
                    }
                    else if (dir == " " fileName != "")                                            
                        //根目录下的文件
                    {
                        path = fileDir;
                        rootFile = fileName;
                    }
                    else if (dir != " " fileName != "")                                            
                        //根目录下的第一级子文件夹下的文件
                    {
                        if (dir.IndexOf("\") > 0)                                                           
                            //指定文件保存的路径
                        {
                            path = fileDir + "\" + dir;
                        }
                    }
                    if (dir == rootDir)                                                                                 
                        //判断是不是需要保存在根目录下的文件
                    {
                        path = fileDir + "\" + rootDir;
                    }
                    //以下为解压缩zip文件的基本步骤
                    //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
                    if (fileName != String.Empty)
                    {
                        FileStream streamWriter = File.Create(path + "\" + 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();
                return rootFile;
            }
            catch (Exception ex)
            {
                return "1; " + ex.Message;
            }
        }  
    }


    引用,新建一个页面,添加两个按钮,为按钮添加Click事件
    源码如下

    复制代码 代码如下:
    protected void Button1_Click(object sender, EventArgs e)
    {
            string[] FileProperties = new string[2];
            FileProperties[0] = "D:\unzipped\";//待压缩文件目录
            FileProperties[1] = "D:\zip\a.zip";  //压缩后的目标文件
            ZipFloClass Zc = new ZipFloClass();
            Zc.ZipFile(FileProperties[0], FileProperties[1]);
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
            string[] FileProperties = new string[2];
            FileProperties[0] = "D:\zip\b.zip";//待解压的文件
            FileProperties[1] = "D:\unzipped\";//解压后放置的目标目录
            UnZipFloClass UnZc = new UnZipFloClass();
            UnZc.unZipFile(FileProperties[0], FileProperties[1]);
    }

    希望本文所述对大家的asp.net程序设计有所帮助。

    您可能感兴趣的文章:
    • C语言压缩文件和用MD5算法校验文件完整性的实例教程
    • 如何用C#实现压缩文件
    • c# 用ICSharpCode组件压缩文件
    • C#创建压缩文件的实现代码
    • Windows系统中C#调用WinRAR来压缩和解压缩文件的方法
    • C#中使用WinRAR实现加密压缩及解压缩文件
    • C#实现rar压缩与解压缩文件的方法
    • c语言压缩文件详细讲解
    上一篇:ASP.NET Repeater 单双行数据换色示例
    下一篇:asp.net页面触发事件panel滚动条高度不变的实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    asp.net C#实现解压缩文件的方法 asp.net,实现,解,压缩,文件,