如何使用 C# 压缩文件及注意的问题

转载 2004年10月29日 11:58:00
 

首选,先要找一个开源的C#压缩组件。
如:ICSharpCode.SharpZipLib 下载地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
根据它的帮助你就可以做自己需要的东东了。
我在使用这个组件行,遇到了一个问题。
当压缩小文件时没有什么错误,一旦源文件达到150M时,它会让你的机器垮掉。(至少是我的机器)
为什么会这样,因为如果源文件是150M时,你就需要在内存申请一个150M大小的字节数组。好点的机器还没问题,一般的机器可就惨了。如果文件在大的话,好机器也受不了的。
为了解决大文件压缩的问题,可以使用分段压缩的方法。

private string CreateZIPFile(string path,int  M)
  {
   try
   {
    Crc32 crc = new Crc32();
    ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipout=new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(System.IO.File.Create(path+".zip"));
    System.IO.FileStream fs=System.IO.File.OpenRead(path);
    long pai=1024*1024*M;//每M兆写一次
    long forint=fs.Length/pai+1;
    byte[] buffer=null;
    ZipEntry entry = new ZipEntry(System.IO.Path.GetFileName(path));
    entry.Size = fs.Length;
    entry.DateTime = DateTime.Now;
    zipout.PutNextEntry(entry);
    for(long i=1;i<=forint;i++)
    {
     if(pai*i<fs.Length)
     {
      buffer = new byte[pai];
      fs.Seek(pai*(i-1),System.IO.SeekOrigin.Begin);
     }
     else
     {
      if(fs.Length<pai)
      {
       buffer = new byte[fs.Length];
      }
      else
      {
       buffer = new byte[fs.Length-pai*(i-1)];
       fs.Seek(pai*(i-1),System.IO.SeekOrigin.Begin);
      }
     }
     fs.Read(buffer,0,buffer.Length);
     crc.Reset();
     crc.Update(buffer);
     zipout.Write(buffer,0, buffer.Length);
     zipout.Flush();
    }
    fs.Close();
    zipout.Finish();
    zipout.Close();
    System.IO.File.Delete(path);
    return path+".zip";
   }
   catch(Exception ex)
   {
    string str=ex.Message;
    return path;
   }   
  }

如何使用C#压缩文件及注意的问题!

首选,先要找一个开源的C#压缩组件。如:ICSharpCode.SharpZipLib 下载地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/D...
  • WindowsBoy
  • WindowsBoy
  • 2004年10月20日 10:12
  • 1467

如何使用C#压缩文件及注意的问题!

首选,先要找一个开源的C#压缩组件。如:ICSharpCode.SharpZipLib 下载地址:http://www.icsharpcode.net/OpenSource/SharpZipLib/D...
  • zhangqs_1981
  • zhangqs_1981
  • 2004年12月08日 17:55
  • 469

C#语言中变量的使用和注意事项

转载c#编程篇:c#编程我不怎么熟悉,既然教材里面有,就顺着它的思路学一下。开始就讲什么变量、内存拉,看看就可以。一、变量声明的问题:1、习惯了vb,大小写是一个十分棘手的问题,又不得不这样做。2、声...
  • ma88fa
  • ma88fa
  • 2004年09月07日 01:01
  • 976

GCD使用注意事项

GCD给我们带了了使用线程方便的同时也埋下了隐患,用不好的话有可能出现死锁。   死锁发生的场景: 1. 使用同步函数dispatch_sync。 2. 使用同步函数的线程跟同步函数执行的bl...
  • SkyNullCode
  • SkyNullCode
  • 2015年11月20日 22:28
  • 1067

IO流中需要注意的几个问题

1.抽象类不能直接声明对象 InputStream、OutputStream、Reader、Writer是抽象类,不能直接申明对象使用。 附:IO继承关系图:除以上四种为抽象类,其他均为其...
  • ml1990s
  • ml1990s
  • 2013年09月05日 21:59
  • 850

java HashMap需要注意的一些地方

在游戏服务器上控制角色的坐标点可以通过Point这个类来实现,地图模块则以HashMap来承载。此问题从简单来说,既HashMap以Point作为Key值时,用户往往会忽略其中一个细节照成后期的非编译...
  • freemindhack
  • freemindhack
  • 2014年07月18日 07:40
  • 518

C++ 多线程注意事项

1.线程中调用对话框控件。 当线程还在调用对话框中的控件时,比如插入数据、删除数据、显示图片等。则会崩溃 2.线程绘制对话框 线程中绘制对话框,第一是会出现上面所说的,第二在低配置的电脑上会出现白...
  • sz76211822
  • sz76211822
  • 2016年09月19日 11:28
  • 491

scrollview注意事项

scrollview只能有一个子控件,如果由于多个线性布局,则用一个大线性布局包起来...
  • xiyangyang8110
  • xiyangyang8110
  • 2017年01月18日 16:09
  • 427

C#编程的一般注意事项

C# 命名原则
  • dingxy
  • dingxy
  • 2011年05月29日 11:07
  • 1122

HashMap使用的注意事项

HashMap是java编程中非常常用的类。非常方便我们构造数据结构。她通过关键字存放各种类型的数据, 使得我们使用的很多。如果要构造这样的一个结构:      keyA        keyA1  ...
  • hantiannan
  • hantiannan
  • 2006年06月07日 22:12
  • 2435
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使用 C# 压缩文件及注意的问题
举报原因:
原因补充:

(最多只允许输入30个字)