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++;
}
}
麻烦知道怎么解决的,帮帮忙,并且说详细点,我是菜鸟,谢谢!
娃,看你写的这代码,不说你自己的电脑了,你老板的电脑都要被你玩死,否则,就是不死不休!
下面的代码给你参考下,具体的没帮你修改:
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++; } }
恩,谢了,我看看
@菜鸟C#菜鸟:
你的内存溢出是因为你的new byte[fs.length],这个fs.length可能是非常大的,内存溢出就很正常了,一般这样的问题都是通过一个小的buffer,通过一个循环不断的读取来完成,比如我给你的参考代码。
4096,4k,是一个大家都喜欢用的数据。
哦哦.....谢了啊!
判断达到上限的时候,分成多个文件压缩,可好?
我想应该是要释放占用内存之类的吧,这个不是byte[] 超出大小,好像是内存溢出了
不过你说的 具体是怎么弄啊 能说具体点么我可以试试
@菜鸟C#菜鸟: FileStream 的长度类型是long,但是byte数组的上限应该是int32,和释放内存关系不大