我是使用ICSharpCode.DLL进行文件压缩的,但是在进行压缩是有几个问题不知怎么解决还请各位大虾请教请教!
   问题描述:我要压缩文件夹“aaaa”中的文件,其中包含有子文件夹、压缩文件和普通的一些文件;当我在进行压缩时,其中的压缩文件是不能进行压缩的,而子文件夹中的文件则被提到压缩文件的第一级,即:压缩文件:aaaa.rar 然后所有的文件都是直接在这个文件目录下(包括子文件夹中的文件,而没有子文件夹),不像WinRar那样,aaaa.rar-------子文件夹----子文件夹----文件
                      |
                      |
                      |-----压缩文件---文件、子文件夹和文件
                      |
                      |
                      |-----文件
想问各位高手,怎样做到这样???多谢多谢....

解决方案 »

  1.   

    在你压缩的时候要自己 模拟一下  比如说你要 让 aaa.txt变为aaa\aaa.txt,压缩方法内部有提供的参数,源码可以更改的 以下是我当时修改过的源码 给你看看 或许有用阿public void ZipFile(string FileToZip, string ZipedFile, int CompressionLevel, int BlockSize)
            {
                //如果文件没有找到,则报错
                if (!System.IO.File.Exists(FileToZip))
                {
                    throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
                }
                System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read);
                System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
                ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
                //修改 生成文件时的文件名字问题 以及压缩后文件中文件的名字
                //修改时间:2007-01-20
                ZipEntry ZipEntry = new ZipEntry(FileToZip.Split('\\')[FileToZip.Split('\\').Length - 1]);
                ZipStream.PutNextEntry(ZipEntry);
                ZipStream.SetLevel(CompressionLevel);
                byte[] buffer = new byte[BlockSize];
                System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length);
                ZipStream.Write(buffer, 0, size);
                try
                {
                    while (size < StreamToZip.Length)
                    {
                        int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                        ZipStream.Write(buffer, 0, sizeRead);
                        size += sizeRead;
                    }
                }
                catch (System.Exception ex)
                {
                    throw ex;
                }
                ZipStream.Finish();
                ZipStream.Close();
                StreamToZip.Close();
            }
            /// <summary>
            /// 根据传输的参数进行压缩处理
            /// 这个参数为 string []  length=2
            /// 1:待压缩文件目录
            /// 2:压缩后的目标文件
            /// Stone修改内容:将压缩后的文件内部的全部路径转换为相对路径
            /// Stone修改时间:2006-01-19
            /// </summary>
            /// <param name="args">1:待压缩文件目录 2:压缩后的目标文件</param>
            public void ZipFileMain(string[] args)
            {
                string[] filenames = Directory.GetFiles(args[0]);
                Crc32 crc = new Crc32();
                ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
                s.SetLevel(6); // 0 - store only to 9 - means best compression
                foreach (string file in filenames)
                {
                    FileStream fs = File.OpenRead(file);
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    //如何将全部路径转换为 相对路径 就是一个文件的名字
                    //注释 修改 2007-01-05
                    string strTempFile = file.Split('\\')[file.Split('\\').Length - 1];
                    //------------------------------------------------
                    ZipEntry entry = new ZipEntry(strTempFile);
                    entry.DateTime = DateTime.Now;
                    entry.Size = fs.Length;
                    fs.Close();                crc.Reset();
                    crc.Update(buffer);                entry.Crc = crc.Value;
                    //将所有的entry文件路径更改为文件名 
                    s.PutNextEntry(entry);                s.Write(buffer, 0, buffer.Length);
                }
                s.Finish();
                s.Close();
            }
        }