/// <summary> /// 准备压缩 /// </summary> /// <param name="units"></param> /// <param name="dirPath"></param> /// <param name="basePath"></param> private static void Prepare(List <GZipUnit> units, string dirPath, string basePath) { foreach (string file in Directory.GetFiles(dirPath)) { byte[] destBuffer = File.ReadAllBytes(file); string relativeFileName = file.Replace(basePath, string.Empty); while (relativeFileName.StartsWith(Path.DirectorySeparatorChar.ToString())) { relativeFileName = relativeFileName.Remove(0, 1); } GZipUnit gzipUnit = new GZipUnit(relativeFileName, destBuffer); units.Add(gzipUnit); } foreach (string dir in Directory.GetDirectories(dirPath)) { Prepare(units, dir, basePath); } }
/// <summary> /// GZip单元解码 /// </summary> /// <param name="buffer">解压后的二进制数组</param> /// <returns></returns> private static List <GZipUnit> Decode(byte[] buffer) { List <GZipUnit> result = new List <GZipUnit>(); for (int i = 0; i < buffer.Length;) { //文件名长度 byte fnLen = buffer[i]; //文件名 byte[] fnBytes = GetSubBytes(buffer, i + 1, fnLen); string fileName = Encoding.Default.GetString(fnBytes); //内容长度 UInt32 cLen = BytesToUInt32(GetSubBytes(buffer, i + 1 + fnLen, 4)); //内容 byte[] cBytes = GetSubBytes(buffer, i + fnLen + 5, (int)cLen); GZipUnit unit = new GZipUnit(fileName, cBytes); result.Add(unit); i += (fnLen + 5 + (int)cLen); } return(result); }