用VS做C/S程序,一个压缩程序,有的时候会出现outofmemoryexception异常,想知道是什么原因,还有具体的解决办法

解决方案 »

  1.   

    内存溢出。这个错误很难说,注意每个地方用GC.collect()方法回收资源,看有没有死循环
      

  2.   

    可以肯定没有死循环,我不知道在什么地方加GC.collect(),我在一个循环结束后加了一个,还是一样,没效果
      

  3.   

    把代码贴出来,大家帮忙看看public static DateTime ZipFiles(string filename,ArrayList arr)
            {
                try
                {
                    ZipOutputStream output = new ZipOutputStream(File.Create(filename));
                    output.SetLevel(6);
                    //string[] dir = Directory.GetFiles(folder);
                    Crc32 crc = new Crc32();
                    foreach (string myFile in arr)
                    {
                        FileStream fs = new FileStream(myFile, FileMode.Open, FileAccess.Read);
                        byte[] bt = new byte[fs.Length];   //运行到这时报错
                        fs.Read(bt, 0, bt.Length);
                        ZipEntry entry = new ZipEntry(myFile);
                        entry.Size = fs.Length;
                        entry.DateTime = DateTime.Now;
                        fs.Close();
                        crc.Reset();
                        crc.Update(bt);
                        entry.Crc = crc.Value;
                        output.PutNextEntry(entry);
                        output.Write(bt, 0, bt.Length);
                    }
                    output.Close();
                }
                catch (Exception e)
                { 
                    MessageBox.Show(e.Message);
                }
                DateTime endzip = DateTime.Now;
                return endzip;
            }
      

  4.   

    可能是你的文件流操作问题。
    不要一次读取文件的所有字节到内存,如File.ReadAllBytes(@"f:\a.txt");
    文件压缩即使是很多个文件,实际处理也是对每个文件逐个压缩,不是一起读到内存流后压缩。
     
      

  5.   

    你标注的出错的地方就是个很大的问题,fs.Length可能达到几个G,全装到数组中肯定内存溢出。
    没用过ZipOutputStream。曾经用过GZip自己写了个压缩。//单个文件压缩到流
    private void CompressFile(FileZipInfo fileEntry, Stream outStream)
    {
    long preStreamPosition = outStream.Position;
    using (FileStream srcStream = new FileStream(fileEntry.FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
    using (GZipStream zipStream = new GZipStream(outStream, CompressionMode.Compress, true))
    {

    int readCount = m_ReadBufferSize; //缓冲区大小
                                        //循环从文件流获取字节,添加到压缩流
    while (readCount == m_ReadBufferSize)
    {
    readCount = srcStream.Read(m_ReadBuffer, 0, m_ReadBufferSize);
    zipStream.Write(m_ReadBuffer, 0, readCount);
    ShowProgressStep();
    }
    }
    fileEntry.CompressLen = (int)(outStream.Position - preStreamPosition); // fileEntry.GZipFileLength = (int)(outStream.Position - preStreamPosition);  // 写入的长度
    }你的代码中错误的地方要改成循环读取方式。可以参照上面的代码片段来写。
      

  6.   

    ZipOutputStream 是使用的SharpZipLib库吗?
    若是的话,请使用新版的库,老版的是有内存溢出的问题。
      

  7.   

    我的SharpZipLib库版本是0.85.5.452   应该算新了吧,现在最高版本是多少?