C# 文件合并与还原

 在工作要用到几个文件合并在一起打包 然后在另外一个C/S 上面来获取解析合并这几个文件,想到用压缩的做法 貌似要需要很多api 刚好参照T-L-V格式的方式自定义个类似的规格在合并及还原文件。

   F-文件标识 N-文件名字标识 L-文件名字所占用的长度 Value- 文件名称内容    C-文件内容标识 L-长度 Value-文件内容


文件合并转换成byte数组

 

  static List<byte> FileToBytes(IEnumerable<string> paths)
        {
            List<byte> lists = new List<byte>();
            foreach (var item in paths)
            {
                string name = item.Substring(item.LastIndexOf("\\") + 1);
                byte[] arr = Encoding.UTF8.GetBytes(name);
                lists.Add(70); //F
                lists.Add(78); //N
                byte[] nameLens = BitConverter.GetBytes(arr.Length);
                lists.AddRange(nameLens);
                lists.AddRange(arr);

                lists.Add(67); //C
                byte[] fileC = File.ReadAllBytes(item);
                byte[] flens = BitConverter.GetBytes(fileC.LongLength);
                lists.AddRange(flens);
                lists.AddRange(fileC);
                lists.Add(69);  //E
            }
            return lists;
        }



 static void BytesToFiles(List<byte> list)
        {
            long len = list.LongCount();
            int index = 0;
            byte[] byteNLen = new byte[4];  //文件名长度
            byte[] byteCLen = new byte[8];  //文件内容
            List<byte> listName = new List<byte>();

            while (index <= len)
            {
                index += 2;
                if (index > len)
                    return;
                listName.Clear();
                list.CopyTo((int)index, byteNLen, 0, 4);
                index += 4;
                int nameLen = BitConverter.ToInt32(byteNLen, 0);

                listName.AddRange(list.Skip(index).Take(nameLen));
                string fileName = Encoding.UTF8.GetString(listName.ToArray());
                index += nameLen;
                index++;

                list.CopyTo((int)index, byteCLen, 0, 8);
                index += 8;
                int contentLen = (int)BitConverter.ToInt64(byteCLen, 0);
                byte[] content = list.Skip(index).Take(contentLen).ToArray();
                index += (contentLen + 1);
                File.WriteAllBytes("e:\\test\\" + fileName, content);
            }
        }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值