• C# Http方式下载文件到本地类改进版


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

    类代码:

    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");
            }
        }
    }
  • 相关阅读:
    UVA 1025 A Spy in the Metro DP水题
    ZOJ 3814 Sawtooth Puzzle BFS
    ZOJ 3816 Generalized Palindromic Number
    UVA 10859 Placing Lampposts 树形DP
    UVA 11825 Hackers' Crackdown 状压DP
    POJ 2887 Big String 线段树 离线处理
    POJ 1635 Subway tree systems Hash法判断有根树是否同构
    BZOJ 3110 k大数查询 & 树套树
    sdoi 2009 & 状态压缩
    来自于2016.2.24的flag
  • 原文地址:https://www.cnblogs.com/heyang78/p/7079322.html
Copyright © 2020-2023  润新知