c#除了常见的使用gzip压缩外,还有其他方案没有?
gzip压缩率比WINRAR差好几倍,还有更好的方案没有?

解决方案 »

  1.   

    首先确定你是需要流压缩,还是文件压缩,如果流压缩的话gzip应该是普遍的选择。
    如果文件压缩的话,你可以选择rar的命令行方式,rar安装目录下有一个console的程序可以调用的。
      

  2.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO.Compression;
    using System.IO;namespace gzipfile
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
     
    //文件流 
    FileStream reader; 
    reader = File.Open("D:\\ddd.txt", FileMode.Open); 
    FileStream writer; 
    writer = File.Create("D:\\ddd.gz"); //压缩相关的流 
    MemoryStream ms = new MemoryStream(); 
    GZipStream zipStream = new GZipStream(ms, CompressionMode.Compress, true); //往压缩流中写数据 
    byte[] sourceBuffer = new byte[reader.Length]; 
    reader.Read(sourceBuffer, 0, sourceBuffer.Length); 
    zipStream.Write(sourceBuffer, 0, sourceBuffer.Length); //一定要在内存流读取之前关闭压缩流 
    zipStream.Close(); 
    zipStream.Dispose(); //从内存流中读数据 
    ms.Position = 0; //注意,不要遗漏此句 
    byte[] destBuffer = new byte[ms.Length]; 
    //ms.Read(destBuffer, 0, destBuffer.Length); byte[] header = new byte [10];
    ms.Read(header, 0, 10);
    header[3] = 8;        //表示包含文件名信息
    byte[] fielContent  = new byte[ms.Length -10] ;
    ms.Read(fielContent, 0, fielContent.Length);string  strfilename = "widebright的文件.txt"; //指定初始文件名
     
    //byte   []  filename=System.Text.Encoding.Convert(System.Text.Encoding.Default,
    //                          //  System.Text.Encoding.GetEncoding("ISO-8859-1"),
    //                           System.Text.Encoding.Default,
    //                            System.Text.Encoding.Default.GetBytes(strfilename));
    byte[] filename = System.Text.Encoding.Default.GetBytes(strfilename);writer.Write(header, 0, header.Length);
    writer.Write(filename, 0, filename.Length);
    writer.WriteByte(0);  //文件名以0 字节结束
    writer.Write(fielContent, 0, fielContent.Length); //关闭并释放内存流 
    ms.Close(); 
    ms.Dispose(); //关闭并释放文件流 
    writer.Close(); 
    writer.Dispose(); 
    reader.Close(); 
    reader.Dispose(); 
            }
        }
    }
      

  3.   

    楼上提供的代码谢了,没有BUG,但是这种方式要写读到内存再压缩
                byte[] sourceBuffer = new byte[reader.Length];
    文件大了会直接报内存溢出
    除了GZIP外还有其他方案吗
    那位可以提供个RAR的压缩的代码?我对gzip的进行2G文件测试结果,压缩时间和WINRAR差不多,但GZIP的压缩效率只有WINRAR的1/5左右
    我想应该有更好的方案