C# http下载大文件,支持断点下载

        /// <summary>
        /// 下载文件,若存在文件,覆盖该文件
        /// </summary>
        /// <param name="sourceFileUrl"></param>
        /// <param name="desFile"></param>
        /// <returns></returns>
        public static bool DownloadFile(string sourceFileUrl, string desFile)
        {
            bool flag = false;
            long SPosition = 0;
            FileStream FStream = null;
            Stream myStream = null;

            sourceFileUrl = System.Web.HttpUtility.UrlPathEncode(sourceFileUrl);

            string tmpFile = desFile + ".tmp";

            try
            {
                if (File.Exists(desFile))
                {
                    File.Delete(desFile);
                }
            }
            catch { }

            if (!Directory.Exists(Path.GetDirectoryName(desFile)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(desFile));
            }

            try
            {
                //判断要下载的文件夹是否存在
                if (File.Exists(tmpFile))
                {
                    //打开上次下载的文件
                    FStream = File.OpenWrite(tmpFile);
                    //获取已经下载的长度
                    SPosition = FStream.Length;
                    long serverFileLength = GetHttpLength(sourceFileUrl);
                    if (serverFileLength == 0)
                        return false;

                    if (SPosition == serverFileLength)
                    {//文件是完整的,直接结束下载任务
                        if (FStream != null)
                        {
                            FStream.Close();
                            FStream.Dispose();
                        }
                        File.Move(tmpFile, desFile);
                        return true;
                    }
                    FStream.Seek(SPosition, SeekOrigin.Current);
                }
                else
                {
                    //文件不保存创建一个文件
                    FStream = new FileStream(tmpFile, FileMode.Create);
                    SPosition = 0;
                }
                //打开网络连接
                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(sourceFileUrl);
                if (SPosition > 0)
                {
                    myRequest.AddRange(SPosition);             //设置Range值
                }
                //向服务器请求,获得服务器的回应数据流
                myStream = myRequest.GetResponse().GetResponseStream();
                //定义一个字节数据
                byte[] btContent = new byte[512];
                int intSize = 0;
                intSize = myStream.Read(btContent, 0, 512);
                while (intSize > 0)
                {
                    FStream.Write(btContent, 0, intSize);
                    intSize = myStream.Read(btContent, 0, 512);
                }

                flag = true;        //返回true下载成功
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //关闭流
                if (myStream != null)
                {
                    myStream.Close();
                    myStream.Dispose();
                }
                if (FStream != null)
                {
                    FStream.Close();
                    FStream.Dispose();
                }
                if (flag)
                {
                    File.Move(tmpFile, desFile);
                }
            }
            return flag;
        }

        static long GetHttpLength(string url)
        {
            long length = 0;
            try
            {
                var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
                req.Method = "HEAD";
                req.Timeout = 5000;
                var res = (HttpWebResponse)req.GetResponse();
                if (res.StatusCode == HttpStatusCode.OK)
                {
                    length = res.ContentLength;
                }
                res.Close();
                return length;
            }
            catch (WebException wex)
            {
                return 0;
            }
        }

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值