在上文基础上增加了远程文件是否存在和本地文件是否存在的判断。

类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;namespace ConsoleTest
{class HttpDldFile{/// <summary>/// Http方式下载文件/// </summary>/// <param name="url">http地址</param>/// <param name="localfile">本地文件</param>/// <returns></returns>public bool Download(string url,string localfile){bool flag = false;long startPosition = 0; // 上次下载的文件起始位置FileStream writeStream; // 写入本地文件流对象long remoteFileLength = GetHttpLength(url);// 取得远程文件长度System.Console.WriteLine("remoteFileLength=" + remoteFileLength);if (remoteFileLength==745){System.Console.WriteLine("远程文件不存在.");return false;}// 判断要下载的文件夹是否存在if (File.Exists(localfile)){writeStream = File.OpenWrite(localfile);             // 存在则打开要下载的文件startPosition = writeStream.Length;                  // 获取已经下载的长度if (startPosition >= remoteFileLength){System.Console.WriteLine("本地文件长度" + startPosition + "已经大于等于远程文件长度" + remoteFileLength);writeStream.Close();return false;}else{writeStream.Seek(startPosition, SeekOrigin.Current); // 本地文件写入位置定位
                }}else{writeStream = new FileStream(localfile, FileMode.Create);// 文件不保存创建一个文件startPosition = 0;}            try{HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接if (startPosition > 0){myRequest.AddRange((int)startPosition);// 设置Range值,与上面的writeStream.Seek用意相同,是为了定义远程文件读取位置
                }Stream readStream = myRequest.GetResponse().GetResponseStream();// 向服务器请求,获得服务器的回应数据流byte[] btArray = new byte[512];// 定义一个字节数据,用来向readStream读取内容和向writeStream写入内容int contentSize = readStream.Read(btArray, 0, btArray.Length);// 向远程文件读第一次long currPostion=startPosition;while (contentSize > 0)// 如果读取长度大于零则继续读
                {currPostion+=contentSize;int percent = (int)(currPostion*100/ remoteFileLength);System.Console.WriteLine("percent=" + percent + "%");writeStream.Write(btArray, 0, contentSize);// 写入本地文件contentSize = readStream.Read(btArray, 0, btArray.Length);// 继续向远程文件读取
                }//关闭流
                writeStream.Close();readStream.Close();flag = true;        //返回true下载成功
            }catch (Exception){writeStream.Close();flag = false;       //返回false下载失败
            }return flag;}// 从文件头得到远程文件的长度private static long GetHttpLength(string url){long length=0;try{HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);// 打开网络连接HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();if (rsp.StatusCode == HttpStatusCode.OK){length = rsp.ContentLength;// 从文件头得到远程文件的长度
                }rsp.Close();return length;}catch(Exception e){return length;}}}
}

测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleTest
{class Program{static void Main(string[] args){HttpDldFile df = new HttpDldFile();df.Download("http://files.cnblogs.com/files/xiandedanteng/Convertor20170624.zip","C:\\test\\Convertor20170624.zip");}}
}

转载于:https://www.cnblogs.com/xiandedanteng/p/7079322.html

C# Http方式下载文件到本地类改进版相关推荐

  1. Linux命令行下载文件到本地

    一直在用ftp工具进行下载,但是很麻烦.现使用Linux命令行的方式下载文件到本地 方案: yum install lrzsz // 下载 上传下载工具sz和rz 安装完之后,输入命令 sz 文件名 ...

  2. 微信小程序 - 下载文件到本地、打开文档

    前言 需求场景描述:接口获取到服务器的文件地址,然后在小程序中下载文件到本地手机上.根据文件格式,下载类型分为下面四种情况: 下载图片到本地 下载视频到本地 打开文档,支持格式:doc, xls, p ...

  3. android file transfer下载_PHP通过header方式下载文件

    php中文网最新课程 每日17点准时技术干货分享 本文为php中文网认证作者:"一朵云彩"投稿,欢迎加入php中文网有偿投稿计划! PHP通过header方式下载文件时,不能使用a ...

  4. PC端下载文件到本地

    最新更新时间:2021年08月12日14:42:40 <猛戳-查看我的博客地图-总有你意想不到的惊喜> 本文内容:前端开发过程中,经常会遇到下载文件到本地的需求,用户点击一个按钮,浏览器会 ...

  5. php保存文件和下载文件到本地的四种方法

    php保存文件和下载文件到本地的四种方法   本文操作环境:windows7系统.PHP7.1版,DELLG3电脑   php保存文件的方法   PHP下载保存文件到本地   经常需要点击按钮,然后弹 ...

  6. 小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)

    小程序配置阿里云OSS下载文件,在请求头里配置生成强制下载链接,(拿到下载链接可以下载文件至本地)(Win10电脑开发环境)**这里只说明小程序端问题**<菜鸡总结大神勿喷!蟹蟹~> 大体 ...

  7. response以流的方式下载文件

    response以流的方式下载文件 /*** 文件下载* @param worldName 获取前端传进来的文件名* @param response*/@GetMapping("/fileD ...

  8. linux下载文件夹到本地命令行,linux下载文件到本地命令,linux下载文件到本地命令 下载工具...

    linux下载文件到本地命令,linux下载文件到本地命令 下载工具 来源:互联网/编辑:佚名/时间:2020-09-08 在手机上看 扫一扫进入手机端 linux用户命令在哪个文件夹下 用 whic ...

  9. xshell下载mysql到本地文件_在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹)-Go语言中文社区...

    在Xshell中上传下载文件到本地(linux中从多次ssh登录的dbserver里面的文件夹) 1 列出所有需要copy的sh文件 -bash-4.1$ ll /mysqllog/osw/*.sh ...

最新文章

  1. Python语言的有限状态机实现样例
  2. java8 list切片_Java8新特性_创建 Stream、流筛选与切片
  3. UA MATH567 高维统计II 随机向量11 kernel的构造 用内积替换反三角函数
  4. 1.6 三维卷积-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. CRM Fiori Simulation pipeline应用点了bubble控件的实现
  6. js 深拷贝 和 浅拷贝
  7. 【NOIP 模拟赛】 道路
  8. http发送16进制报文_HTTP系列探索HTTP网络层的”前端性能优化“
  9. centos7远程桌面端口_CentOS7启用远程桌面连接
  10. 基于Redis的CustomerSessionProvider(一)
  11. updatebyprimarykeyselective的where条件是全部字段_多组连续数据对比,不满足单因素方差分析的条件怎么办?...
  12. 如何在NVIDIA(英伟达)官网下载老版本Toolkit-SDK---例如下载CUDA Toolkit 8.0
  13. C#字符串转Json,Json解析
  14. 《Apache Spark源码剖析》
  15. 如何查询出指定地点对应的经纬度(高德地图)
  16. python sha1加密字符串
  17. Spring Event 事件发布/监听机制 详解并使用
  18. 前端入门【HTML5】
  19. cglib BeanCopier 使用
  20. python简单名片管理器,一个简单的Python名片管理系统

热门文章

  1. html hr线的样式
  2. Javascript类型转换的规则
  3. Django POST请求错误
  4. JavaScript事件绑定
  5. 一个简单的Android音乐播放器
  6. 已解决:Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshaketimeout
  7. leetcode 1: 找出两个数相加等于给定数 two sum
  8. 深入理解ASCII,Unicode和UTF-8编码
  9. lvm的备份还原及修改UUID
  10. Oracle Enterprise Manager 11g: Empowering IT to Drive Business Value