用VS做C/S程序,一个压缩程序,有的时候会出现outofmemoryexception异常,想知道是什么原因,还有具体的解决办法
解决方案 »
- C# 操作计算器
- 请教有关WSDL生成的代理类
- System.Threading.Thread.Sleep(i);这句话是什么意思 ?
- 关于var
- 也就是说可以在我们自己的WEB页面中有个象EXCEL或WORD的一样的编辑器
- 请教如何改变WinForm DataGrid 的列的列头的高度!网上没有找到。。。
- 求救!使用Nunit-Gui V2.2进行单元测试时,一运行测试就出错的问题!说System.IO.FileNotFoundException:找不到文件或程序集!
- 请教大神们一个关于winform获取输入法的问题
- 抽象类和接口有什么区别呀?
- 键值对数据如何按照添加顺序输出?
- c# winform查找父控件
- DataGridView 委托 异常:参数计数不匹配
{
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;
}
不要一次读取文件的所有字节到内存,如File.ReadAllBytes(@"f:\a.txt");
文件压缩即使是很多个文件,实际处理也是对每个文件逐个压缩,不是一起读到内存流后压缩。
没用过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); // 写入的长度
}你的代码中错误的地方要改成循环读取方式。可以参照上面的代码片段来写。
若是的话,请使用新版的库,老版的是有内存溢出的问题。