和其配对的压缩算法是可以压缩多个文件的,但是拿它来解压,却不能解压,只能解压一个文件
哪个高手能帮我改改,改成能正常解压内含多个文件的压缩文档
 public void UnZip(string[] args)//形参是一个路径的数组,args[0]是解压文件路径aegs[1]是解压存放路径
        {
            ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));            ZipEntry theEntry;
            while ((theEntry = s.GetNextEntry()) != null)
            {                string directoryName = Path.GetDirectoryName(args[1]);
                string fileName = Path.GetFileName(theEntry.Name);                //生成解压目录
                Directory.CreateDirectory(directoryName);                if (fileName != String.Empty)
                {
                    //解压文件到指定的目录
                    FileStream streamWriter = File.Create(args[1]+theEntry.Name);                    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();
        }

解决方案 »

  1.   

    ICSharpZipLib 里就有这方面的操作啊。
      

  2.   


       ///   <summary>
            ///   解压缩文件多目录
            ///   </summary>
            ///   <param   name= "TargetFile "> 待解压的文件 </param>
            ///   <param   name= "fileDir "> 解压出来的文件保存的路径 </param>
            ///   <returns> </returns>
            public string unZipFile( string TargetFile, string fileDir )
            {
                #region
                string rootFile = " ";
                try
                {                
                    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;
                        }                  
                        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;
                }
                #endregion
            }
      

  3.   

    /// <summary>
    /// 压缩和解压文件
    /// </summary>
    public class ZipClass
    {
    /// <summary>
    /// 所有文件缓存
    /// </summary>
    List<string> files = new List<string>();/// <summary>
    /// 所有空目录缓存
    /// </summary>
    List<string> paths = new List<string>();/// <summary>
    /// 压缩目录(包括子目录及所有文件)
    /// </summary>
    /// <param name="rootPath">要压缩的根目录</param>
    /// <param name="destinationPath">保存路径</param>
    /// <param name="compressLevel">压缩程度,范围0-9,数值越大,压缩程序越高</param>
    public void ZipFileFromDirectory(string rootPath, string destinationPath, int compressLevel)
    {
    GetAllDirectories(rootPath);/* while (rootPath.LastIndexOf("\\") + 1 == rootPath.Length)//检查路径是否以"\"结尾
    {rootPath = rootPath.Substring(0, rootPath.Length - 1);//如果是则去掉末尾的"\"}
    */
    //string rootMark = rootPath.Substring(0, rootPath.LastIndexOf("\\") + 1);//得到当前路径的位置,以备压缩时将所压缩内容转变成相对路径。
    string rootMark = rootPath + "\\";//得到当前路径的位置,以备压缩时将所压缩内容转变成相对路径。
    Crc32 crc = new Crc32();
    ZipOutputStream outPutStream = new ZipOutputStream(File.Create(destinationPath));
    outPutStream.SetLevel(compressLevel); // 0 - store only to 9 - means best compression
    foreach (string file in files)
    {
    FileStream fileStream = File.OpenRead(file);//打开压缩文件
    byte[] buffer = new byte[fileStream.Length];
    fileStream.Read(buffer, 0, buffer.Length);
    ZipEntry entry = new ZipEntry(file.Replace(rootMark, string.Empty));
    entry.DateTime = DateTime.Now;
    // set Size and the crc, because the information
    // about the size and crc should be stored in the header
    // if it is not set it is automatically written in the footer.
    // (in this case size == crc == -1 in the header)
    // Some ZIP programs have problems with zip files that don't store
    // the size and crc in the header.
    entry.Size = fileStream.Length;
    fileStream.Close();
    crc.Reset();
    crc.Update(buffer);
    entry.Crc = crc.Value;
    outPutStream.PutNextEntry(entry);
    outPutStream.Write(buffer, 0, buffer.Length);
    }this.files.Clear();foreach (string emptyPath in paths)
    {
    ZipEntry entry = new ZipEntry(emptyPath.Replace(rootMark, string.Empty) + "/");
    outPutStream.PutNextEntry(entry);
    }this.paths.Clear();
    outPutStream.Finish();
    outPutStream.Close();
    GC.Collect();
    }/// <summary>
    /// 取得目录下所有文件及文件夹,分别存入files及paths
    /// </summary>
    /// <param name="rootPath">根目录</param>
    private void GetAllDirectories(string rootPath)
    {
    string[] subPaths = Directory.GetDirectories(rootPath);//得到所有子目录
    foreach (string path in subPaths)
    {
    GetAllDirectories(path);//对每一个字目录做与根目录相同的操作:即找到子目录并将当前目录的文件名存入List
    }
    string[] files = Directory.GetFiles(rootPath);
    foreach (string file in files)
    {
    this.files.Add(file);//将当前目录中的所有文件全名存入文件List
    }
    if (subPaths.Length == files.Length && files.Length == 0)//如果是空目录
    {
    this.paths.Add(rootPath);//记录空目录
    }
    }/// <summary>
    /// 解压缩文件(压缩文件中含有子目录)
    /// </summary>
    /// <param name="zipfilepath">待解压缩的文件路径</param>
    /// <param name="unzippath">解压缩到指定目录</param>
    /// <returns>解压后的文件列表</returns>
    public List<string> UnZip(string zipfilepath, string unzippath)
    {
    //解压出来的文件列表
    List<string> unzipFiles = new List<string>();//检查输出目录是否以“\\”结尾
    if (unzippath.EndsWith("\\") == false || unzippath.EndsWith(":\\") == false)
    {
    unzippath += "\\";
    }ZipInputStream s = new ZipInputStream(File.OpenRead(zipfilepath));
    ZipEntry theEntry;
    while ((theEntry = s.GetNextEntry()) != null)
    {
    string directoryName = Path.GetDirectoryName(unzippath);
    string fileName = Path.GetFileName(theEntry.Name);//生成解压目录【用户解压到硬盘根目录时,不需要创建】
    if (!string.IsNullOrEmpty(directoryName))
    {
    Directory.CreateDirectory(directoryName);
    }if (fileName != String.Empty)
    {
    //如果文件的压缩后大小为0那么说明这个文件是空的,因此不需要进行读出写入
    if (theEntry.CompressedSize == 0)
    break;
    //解压文件到指定的目录
    directoryName = Path.GetDirectoryName(unzippath + theEntry.Name);
    //建立下面的目录和子目录
    Directory.CreateDirectory(directoryName);//记录导出的文件
    unzipFiles.Add(unzippath + theEntry.Name);FileStream streamWriter = File.Create(unzippath + theEntry.Name);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();
    GC.Collect();
    return unzipFiles;
    }