/// <summary> /// 创建分片 /// </summary> /// <param name="filesize">文件的大小</param> /// <param name="sliceSize">分片的字节大小</param> /// <returns>返回分片列表</returns> public static List<Slice> CreateSliceList(long filesize, int sliceSize) { List<Slice> slicelist = new List<Slice>(); #region 开始分片 long slice_count = 0; //分片数量 // 先按照最小分片计算分片数量 long slice_size = sliceSize; slice_count = (int)(filesize / slice_size); if ((filesize % slice_size) != 0) slice_count++; long offset = 0; for (int i = 0; i < slice_count; i++) { Slice ts = new Slice() { index = i, start = offset, totalSize = slice_size }; if (ts.start + ts.totalSize > filesize) ts.totalSize = filesize - ts.start; offset += slice_size; slicelist.Add(ts); } #endregion return slicelist; }
/// <summary> /// 读入一个分片 /// </summary> /// <param name="br">用于读入数据的流</param> /// <returns></returns> public static Slice ReadSlice(BinaryReader br) { byte[] bs; Slice slice = new Slice(); slice.index = br.ReadInt32(); slice.start = br.ReadInt64(); slice.totalSize = br.ReadInt64(); slice.doneSize = br.ReadInt64(); slice.status = (SliceStatus)br.ReadInt32(); int len = br.ReadInt32(); if (len > 0) { bs = br.ReadBytes(len); slice.md5 = Encoding.UTF8.GetString(bs).Trim('\0').Trim(); } return slice; }
/// <summary> /// 写入一个分片 /// </summary> /// <param name="br">用于写入数据的流</param> /// <param name="slice">待写入的分片</param> public static void WriteSlice(BinaryWriter br, Slice slice) { byte[] bs; br.Write(slice.index); br.Write(slice.start); br.Write(slice.totalSize); br.Write(slice.doneSize); br.Write((int)slice.status); if (!string.IsNullOrEmpty(slice.md5)) { bs = Encoding.UTF8.GetBytes(slice.md5); br.Write(bs.Length); br.Write(bs); } else { br.Write((int)0); } }