C# 分段读/写文件(可实现断点续传)

            string filePath = @"C:\Users\wangbinbin\Desktop\TestDemo\TestDemo\files\imgs.rar";
            string savePath = string.Format(@"C:\Users\wangbinbin\Desktop\TestDemo\TestDemo\files\jayzai_{0}.rar", DateTime.Now.ToString("yyyyMMddHHmmssffff"));
            using (FileStream fsRead = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                //文件总长度
                long left = fsRead.Length;
                //存储读取结果  
                byte[] bytes = new byte[1024];
                //每次读取长度  
                int maxLength = bytes.Length;
                using (FileStream fsWrite = new FileStream(savePath, FileMode.Append, FileAccess.Write))
                {
                    int start = 0;
                    int num = 0;
                    while (left > 0)
                    {
                        fsRead.Position = start;
                        num = 0;
                        if (left < maxLength)
                            num = fsRead.Read(bytes, 0, Convert.ToInt32(left));
                        else
                            num = fsRead.Read(bytes, 0, maxLength);

                        if (num == 0)
                            break;

                        //保存文件
                        fsWrite.Write(bytes, 0, bytes.Length);

                        start += num;
                        left -= num;
                    }
                }
            }

            List<FileStreamModel> list = new List<FileStreamModel>();
            using (FileStream fsRead = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                //文件总长度
                long left = fsRead.Length;
                //存储读取结果  
                byte[] bytes = new byte[1024];
                //每次读取长度  
                int maxLength = bytes.Length;

                int start = 0;
                int num = 0;
                while (left > 0)
                {
                    fsRead.Position = start;
                    num = 0;
                    if (left < maxLength)
                        num = fsRead.Read(bytes, 0, Convert.ToInt32(left));
                    else
                        num = fsRead.Read(bytes, 0, maxLength);

                    if (num == 0)
                        break;

                    list.Add(new FileStreamModel { offset = start, file = Convert.ToBase64String(bytes) });

                    start += num;
                    left -= num;
                }
            }
            if (list != null && list.Count > 0)
            {
                using (FileStream fsWrite = new FileStream(savePath, FileMode.Append, FileAccess.Write))
                {
                    foreach (var obj in list)
                    {
                        byte[] bytes = Convert.FromBase64String(obj.file);
                        fsWrite.Write(bytes, 0, bytes.Length);
                    }
                }
            }

            if (list != null && list.Count > 0)
            {
                using (FileStream fsWrite = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                {
                    //OrderBy随机:打乱了分段顺序;自己测试玩的,可以去掉OrderBy
                    foreach (var obj in list.OrderBy(o => Guid.NewGuid()))
                    {
                        byte[] bytes = Convert.FromBase64String(obj.file);
                        fsWrite.Seek(obj.offset, SeekOrigin.Begin);
                        fsWrite.Write(bytes, 0, bytes.Length);
                    }
                }
            }

            if (list != null && list.Count > 0)
            {
                using (FileStream fsWrite = new FileStream(savePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                {
                    //OrderBy随机:打乱了分段顺序;自己测试玩的,可以去掉OrderBy
                    var binaryWriter = new BinaryWriter(fsWrite);
                    foreach (var obj in list.OrderBy(o => Guid.NewGuid()))
                    {
                        binaryWriter.Seek(obj.offset, SeekOrigin.Begin);
                        byte[] bytes = Convert.FromBase64String(obj.file);
                        binaryWriter.Write(bytes);//写入数据
                    }
                    binaryWriter.Close();
                }
            }


    public class FileStreamModel
    {
        public int offset { get; set; }

        public string file { get; set; }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值