首页 新闻 会员 周边 捐助

asp.net sharpziplib压缩文件夹 引发类型为“System.OutOfMemoryException”的异常。

0
[已解决问题] 解决于 2014-10-23 15:59

private void writeStream(ref ZipOutputStream s, FileInfo[] a, Crc32 crc)

{

foreach (FileInfo fi in a)

{

      using (FileStream fs = fi.OpenRead())

    {

      byte[] buffer = new byte[fs.Length];//这一行报错,压缩到一定大小就报错,我知道是内存溢出了,但是不知道怎么解决

      fs.Read(buffer, 0, buffer.Length);

      string file = fi.FullName;

       file = file.Replace(cutStr, "");

      ZipEntry entry = new ZipEntry(file);

      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);

     }

      GC.Collect();

     GC.WaitForPendingFinalizers();

      //压缩的文件数

       _indexcount++;

  }

}

问题补充:

麻烦知道怎么解决的,帮帮忙,并且说详细点,我是菜鸟,谢谢!

ydpC#的主页 ydpC# | 初学一级 | 园豆:183
提问于:2014-09-23 15:53
< >
分享
最佳答案
0

娃,看你写的这代码,不说你自己的电脑了,你老板的电脑都要被你玩死,否则,就是不死不休!

下面的代码给你参考下,具体的没帮你修改:

        private void writeStream(ref ZipOutputStream s, FileInfo[] a, Crc32 crc)
        {
            foreach (FileInfo fi in a)
            {
                using (FileStream fs = fi.OpenRead())
                {
                    string file = fi.FullName;
                    file = file.Replace(cutStr, "");
                    ZipEntry entry = new ZipEntry(file);
                    entry.DateTime = DateTime.Now;
                    entry.Size = fs.Length;
                    byte[] buffer = new byte[4096];//这一行报错,压缩到一定大小就报错,我知道是内存溢出了,但是不知道怎么解决
                    int count = 0;
                    crc.Reset();
                    while ((count = fs.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        crc.Update(buffer);
                        s.Write(buffer, 0, count);
                    }
                    entry.Crc = crc.Value;
                    s.PutNextEntry(entry);

                }
                GC.Collect();
                GC.WaitForPendingFinalizers();
                //压缩的文件数
                _indexcount++;
            }
        }
奖励园豆:5
519740105 | 大侠五级 |园豆:5810 | 2014-09-23 18:03

恩,谢了,我看看

ydpC# | 园豆:183 (初学一级) | 2014-09-23 18:04

@菜鸟C#菜鸟: 

你的内存溢出是因为你的new byte[fs.length],这个fs.length可能是非常大的,内存溢出就很正常了,一般这样的问题都是通过一个小的buffer,通过一个循环不断的读取来完成,比如我给你的参考代码。

4096,4k,是一个大家都喜欢用的数据。

519740105 | 园豆:5810 (大侠五级) | 2014-09-23 18:07

哦哦.....谢了啊!

ydpC# | 园豆:183 (初学一级) | 2014-09-23 18:09
其他回答(1)
0

判断达到上限的时候,分成多个文件压缩,可好?

draculav | 园豆:734 (小虾三级) | 2014-09-23 16:48

我想应该是要释放占用内存之类的吧,这个不是byte[] 超出大小,好像是内存溢出了

支持(0) 反对(0) ydpC# | 园豆:183 (初学一级) | 2014-09-23 16:51

不过你说的 具体是怎么弄啊  能说具体点么我可以试试

支持(0) 反对(0) ydpC# | 园豆:183 (初学一级) | 2014-09-23 16:52

@菜鸟C#菜鸟: FileStream 的长度类型是long,但是byte数组的上限应该是int32,和释放内存关系不大

支持(0) 反对(0) draculav | 园豆:734 (小虾三级) | 2014-09-23 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册