You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.2 KiB
94 lines
3.2 KiB
using Externals.Compression;
|
|
using Externals.Compression.Zip;
|
|
using Externals.Compression.Checksums;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace Apewer.Internals
|
|
{
|
|
|
|
internal class ZipUtility
|
|
{
|
|
|
|
/// <summary>压缩字典为 .ZIP 文件。</summary>
|
|
/// <param name="files">由文件名和文件内容组成的字典。</param>
|
|
public static System.IO.MemoryStream ToZip(Dictionary<string, byte[]> files)
|
|
{
|
|
var memorystream = new System.IO.MemoryStream();
|
|
if (files == null) return memorystream;
|
|
|
|
var zipstream = new ZipOutputStream(memorystream);
|
|
zipstream.SetLevel(1);
|
|
|
|
foreach (var file in files)
|
|
{
|
|
var crc = new Crc32();
|
|
crc.Reset();
|
|
crc.Update(file.Value);
|
|
|
|
var zipentry = new ZipEntry(file.Key);
|
|
zipentry.CompressionMethod = CompressionMethod.Deflated;
|
|
//vzipentry.Size = vfile.Value.LongLength;
|
|
zipentry.Crc = crc.Value;
|
|
zipentry.IsUnicodeText = true;
|
|
|
|
zipstream.PutNextEntry(zipentry);
|
|
zipstream.Write(file.Value, 0, file.Value.Length);
|
|
zipstream.CloseEntry();
|
|
}
|
|
|
|
zipstream.IsStreamOwner = false;
|
|
zipstream.Finish();
|
|
zipstream.Flush();
|
|
zipstream.Close();
|
|
|
|
return memorystream;
|
|
}
|
|
|
|
/// <summary>解压 .ZIP 文件为字典。</summary>
|
|
public static Dictionary<string, byte[]> FromZip(byte[] zipdata)
|
|
{
|
|
var result = new Dictionary<string, byte[]>();
|
|
if (zipdata == null) return result;
|
|
if (zipdata.LongLength < 1) return result;
|
|
|
|
var packagememory = new System.IO.MemoryStream(zipdata);
|
|
try
|
|
{
|
|
var zipstream = new ZipInputStream(packagememory);
|
|
while (true)
|
|
{
|
|
var entry = zipstream.GetNextEntry();
|
|
if (entry == null) break;
|
|
|
|
if (entry.IsFile)
|
|
{
|
|
var cellname = entry.Name;
|
|
var celldata = new byte[0];
|
|
{
|
|
var cellstream = new System.IO.MemoryStream();
|
|
while (true)
|
|
{
|
|
var blockdata = new byte[1024];
|
|
var blockread = zipstream.Read(blockdata, 0, 1024);
|
|
if (blockread < 1) break;
|
|
cellstream.Write(blockdata, 0, blockread);
|
|
}
|
|
celldata = cellstream.ToArray();
|
|
cellstream.Dispose();
|
|
}
|
|
if (result.ContainsKey(cellname)) result[cellname] = celldata;
|
|
else result.Add(cellname, celldata);
|
|
}
|
|
}
|
|
zipstream.Dispose();
|
|
}
|
|
catch { }
|
|
packagememory.Dispose();
|
|
return result;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|