Exemple #1
0
        /// <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);
            }
        }
Exemple #2
0
        /// <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);
        }