• 您的信息
      • 日期时间
        2025年3月3日 星期一
        【蛇】己卯月辛未日
        乙巳年 二月初四
        全国爱耳日
        您的信息
        您的IP:
        3.131.141.91
        操作系统:
        未知操作系统
        浏览器:
        未知浏览器
        分辨率:
        1280x720
        位置:
        缂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈嗙節閳ь剚娼忛埡鍌ゆ綗闂佸湱鍎ら弻锟犲磻閹剧粯鏅查幖绮光偓鎻掝棜缂傚倷鐒︽晶搴ㄥ疾濠婂懏宕叉繛鎴烇供閸熷懏銇勯弮鍥у惞闁烩晛閰i弻娑㈠Ψ閿旇棄鍞夊┑顔硷龚濞咃綁宕犻弽顓炲嵆闁绘洑璁查崑鎾诲幢濞戞瑧鍘搁梺鍛婁緱閸犳岸鎯岄幒鎾变簻闁靛骏绱曢幊鍥┾偓娈垮櫘閸o絽鐣烽幒鎴斿牚闁告粌鍟伴梻顖涚節閻㈤潧浠╅柟娲讳簽瀵板﹪鎳為妷褏褰炬繝鐢靛Т濞层倗澹曢崸妤佺厵闁规鍠栭。濂告煟閹惧崬鍔滅紒缁樼洴楠炲鎮欓崹顐㈡珬缂傚倷璁查崑鎾愁熆閼搁潧濮堥柣鎾崇箻閺屾盯濡烽敐鍛瀳婵犳鍠栫粔鐢搞€冮妷鈺傚€烽柡澶嬪灦鐠囩偛螖閻橀潧浠﹀畝锝呮健閸┾偓妞ゆ帊鑳堕埊鏇㈡煥閺囨娅嗙紒鍌涘笩椤﹁鎱ㄦ繝鍌ょ吋鐎规洘甯掗埢搴ㄥ箛椤斿搫浠掑┑鐘垫暩閸嬫盯藝閺夋5娲偄妞嬪孩娈鹃梺瑙勫劶婵倝寮插┑瀣厱閻忕偟鍋撻惃鎴炪亜閺傛寧顥㈡慨濠呮閹瑰嫰濡搁妷锔惧綒闂備胶鎳撻崵鏍箯閿燂拷 濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ゆ繛纭风節瀵鎮㈢悰鈥充壕闁汇垻娅ラ悷鎵懃缂傚倸鍊峰ù鍥╃礄娴兼潙纾规繝闈涱儏閽冪喖鏌ㄩ弴妤€浜鹃柧浼欑到閵嗘帒顫濋悡搴d画闂佹寧绋戝Λ妤呭煘閹达附鍊烽柛娆忣槴閺嬫瑦绻涚€涙ḿ鐭嬬紒顔艰嫰鐓ら柛褎顨嗛埛鎺懨归敐鍫綈闁稿濞€閺屾稒鎯旈妶鍛優閻庡灚婢橀敃顏堝箠閻愬搫唯鐟滄粌煤閹间焦鈷戠紓浣姑慨锕傛煕閹炬潙鍝虹€规洩缍€缁犳盯寮埀顒勫矗韫囨柧绻嗛柣鎰邦杺閸ゆ瑥霉濠婂嫬鍔ら柍瑙勫灴閸┿儵宕卞鎯у毐婵犵數鍋涢ˇ鏉棵洪悢鐓庣疇闁绘劗鍎ら悞鑲┾偓骞垮劚濡鈻撻幇鐗堚拺闁告劕寮堕幆鍫ユ煕閻旇泛宓嗛柡浣哥Т楗即宕奸悢鍙夊缂傚倷绀侀鍡欌偓绗涘喛鑰块柣妤€鐗婇崣蹇斾繆椤栨簱瑙勪繆娴犲鐓涢柛娑卞亜閸旀岸鏌嶇憴鍕伌闁诡喒鏅涢埢鎾诲箰鎼淬埄鍞剁紓鍌氬€峰ù鍥ㄣ仈缁嬫5娲偄妞嬪孩娈惧┑掳鍊愰崑鎾淬亜椤愶絿鐭掗柛鈹惧亾濡炪倖宸婚崑鎾淬亜閺囶亞绉い銏℃礋閺佸啴鍩€椤掑倸顥氬┑鍌氭啞閻撶喖鏌熼柇锕€澧婚柛銈囧枛閺屾稑鈻庤箛鏃戞濡炪値浜滈崯瀛樹繆閸洖骞㈡繛鍡楁禋濞奸绱撻崒娆戭槮妞ゆ垵妫涢弫顕€鍨鹃幇浣告闂佽鍎煎Λ鍕纯濠电姰鍨煎▔娑㈩敄閸岀偛绠┑鐘崇閳锋垹绱掔€n偄顕滄繝鈧导瀛樼厽闁绘梹绻傚▔姘跺炊椤掍焦娅囬梺绋挎湰缁嬫捇宕㈤棃娑掓斀闁绘劕鐡ㄧ紞鎴炪亜閹存繂鈧灝鐣烽幋锕€绠婚柤绋跨仛閸庤鲸绻涙潏鍓хК妞ゎ偄顦垫俊闈涒攽鐎n偆鍘告繛杈剧悼鏋柡鍡悼閳ь剝顫夊ú妯兼暜閹烘缍栨繝闈涱儏缁犵喖鎮楅敐搴″闁兼澘娼″濠氬磼濮橆兘鍋撻悜鑺ュ殑闁告挷鐒﹂崗婊堟煕椤愶絾绀€缂佲偓閸喓绡€闂傚牊绋撴晶銏ゆ煟椤撶喓鎳囬柡宀€鍠栭幃婊冾潨閸℃ḿ鏆ョ紓浣瑰劤婢х晫鍒掗娑氣攳濠电姴娴傞弫宥嗙箾閹寸偟顣查柤鍨处缁绘稓鈧稒岣块惌瀣磼椤旇姤宕岀€殿喖顭烽弫鎾绘偐閼碱剙鈧偛顪冮妶搴″箺闁搞劌鐖奸幃楣冩嚋閻㈢數顔曢柣搴㈢⊕宀e潡鎯岀€n喗鐓曢幖娣灩閳绘洟鏌涢埡鍐ㄤ槐妤犵偛顑夐弫鍌滅磼濡粯鐝︾紓鍌欒兌閾忓酣宕i崘顔肩哗闂侇剙绉撮弸渚€鏌熼鍡忓亾闁衡偓娴犲鐓ユ繛鎴灻鈺伱归悩鍐茬缂佽鲸甯¢、娆撴偩鐏炴儳娅氬┑鐘殿暯閳ь剙纾幗鐘绘煙瀹勭増鍣介柛鏍ㄧ墵瀵挳鎮㈢悰鈥充壕濠电姵纰嶉埛鎴︽偡濞嗗繐顏╅柛鏂诲€濋弻娑㈡偄闁垮浠撮梺璇″枟椤ㄥ﹪銆佸鈧幃婊堝幢濡櫣妲i梻鍌欑窔濞佳囨偋閸℃あ娑樷枎閹炬潙鈧埖绻濋棃娑卞剱闁绘挻娲熼弻锟犲炊閵夈儱顬堟繝鈷€灞芥灓闁汇儺浜幃娆擃敆閳ь剟鍩㈤弴鐔稿弿濠电姴鍟妵婵堚偓瑙勬处閸嬪﹤鐣烽悢纰辨晣闁绘ɑ褰冭潕缂傚倸鍊搁崐鎼佸磹閸濄儳鐭撶€规洖娲﹂鑺ユ叏濡灝鐓愰柛瀣戦妵鍕籍閸屾瀚涘┑鐐殿儠閸旀垿寮诲鍫闂佸憡鎸鹃崰鏍偘椤曗偓瀵粙顢栭崣銉︾潖闂備礁婀遍崕銈囨崲閸愵喖鐤炬繝闈涙-濞撳鏌曢崼婵囶棞濠殿啫鍛=鐎广儱鎳忓婵囦繆閸欏濮囬摶鏍煕濞戝崬鏋撻柟閿嬫そ閺岋綁鎮╅崣澶婎槱閻熸粍婢橀崯鎾€佸Δ鍛潊閹鸿櫕绂嶅⿰鍫熺厸闁告劧绲芥禍楣冩⒑缂佹﹩娈樺┑顔芥尦閹箖鎮滈挊澶岄獓濠电偛妫涢崑鎾诲磽闂堟侗娓婚柕鍫濇鐏忛潧鈹戦鑲╋紞闁告帗甯″鍫曞箣閺冣偓閺傗偓闂備焦瀵х粙鎴犫偓姘煎墯缁傚秵绺介崨濠勫幈婵犵數濮撮崯顐f叏瀹ュ洠鍋撳▓鍨灍鐟滄澘鍟撮崺鐐哄箣閻橆偄浜鹃柨婵嗙凹缁ㄥ鏌涚€n亞效闁诡喖鍢查オ浼村礋椤掑顥堝┑鐘殿暯閳ь剙纾崺锝嗐亜閵忊剝顥堢€规洏鍔戦、娑樷堪閸涱噮娼撴繝鐢靛У椤旀牠宕板Δ鍛櫇闁冲搫鎳庣粈鍫熺箾閹存瑥鐏╅柛灞诲妿缁辨帞鈧綆浜炲銊╂煛閳ь剚绂掔€n偆鍘藉┑鈽嗗灡鐎笛囨偟椤忓棛纾奸柍褜鍓熷畷濂稿Ψ閿旇瀚兼俊鐐€栭弻銊︽櫠閸婄喆浜归柣銏犳啞閳锋帡鏌涚仦鎹愬闁逞屽墯閹倸鐣烽幇鏉跨濞达絽鎽滈敍娆撴⒑瑜版帗锛熺紒鈧担鍝勵棜闁革富鍘搁崑鎾绘偡閺夋浠鹃梺闈╃悼椤ユ劙濡甸幇鏉跨闁瑰濮撮埀顒傚仱閹嘲饪伴崟顓犵厐闂傚洤顦甸弻鈥愁吋鎼粹€崇闂佺粯鎸哥换鎰板煘閹达附鍊烽梻鍫熺◥婢规洖鈹戦悙鍙夊櫣婵☆偅绻堝璇测槈閵忕姈褔鏌涘☉鍗炲季濞寸厧鍟村娲传閸曨噮娼堕梺绋匡攻椤ㄥ牓宕氶幒鎴旀瀻闁瑰鍋涚壕顖炴⒑闂堟胆褰掑磹濡や降浠氶柧蹇e亞缁♀偓闂佹眹鍨藉ḿ褎绂掑⿰鍫熺厵闁惧浚鍋勬慨鍫ユ煙娓氬灝濮傜€规洖缍婇、鏇㈠Χ閸屾稒鏆ゆ繝鐢靛Х閺佸憡鎱ㄩ弶鎳ㄦ椽濡堕崨顔惧嚱闂傚倸鍊烽懗鑸电仚闂佸搫鐗滈崜鐔煎箚瀹€鍕垫晩闁伙絽鐬艰ぐ楣冩⒑閸濆嫭鍌ㄩ柛銊︽そ閸╂盯骞掗幊銊ョ秺閺佹劖寰勫Ο娲绘濠电偞鍨堕幑浣轰焊濞嗘垶顫曢柟鐑橆殘閸欐挻銇勯幘璺盒ラ柣鎾存崌濮婅櫣鎷犻垾铏亶闂佹寧纰嶉妵鍕敃閿濆洨鐣奸梺鍦嚀鐎氫即骞栭崷顓熷珰闁炽儴娅曢弳鈺呮⒒閸屾艾鈧绮堟笟鈧獮澶愭晬閸曨厾鐓撻梺鍦劋閸ㄧ偟绱撳顓犵闁糕剝蓱鐏忣厾绱掗悩宕囧弨闁哄被鍊濆畷顐﹀Ψ閵夈倕瀵插┑鐐茬摠缁秶鍒掗幘璇茶摕闁绘梻鍘х粻姘辨喐濠婂牆鍚归柣鏂垮悑閻撳啯銇勯弽銊р姇缂佲偓鐎n喗鐓涚€光偓鐎n剛袣缂備胶濮甸惄顖炵嵁濮椻偓閹煎綊顢曢敐搴℃暭濠电姷鏁搁崕鎴犲緤閽樺娲Χ婢跺娅囧銈呯箰閻楀棛绮婚弽銊х闁糕剝蓱閹嫰鏌℃担绋库偓鍧楀蓟濞戙垹鍗虫俊顖氭惈椤牊绻涚€涙ḿ鐭掔紒鐘崇墵瀵鍨鹃幇浣告倯闁硅偐琛ラ埀顒€纾鎰磽閸屾瑨鍏屽┑顕€娼ч…鍨熺捄銊ょ胺闂傚倷鐒︾€笛呮崲閸岀偛绠犻幖娣妼濮瑰弶绻涢崱妯虹仼婵☆偒鍨堕弻鐔碱敍閸℃鐏遍柛姘儔濮婃椽宕崟顓犲姽缂傚倸绉崇粈渚€顢氶敐澶樻晪闁逞屽墮閻i攱绺介崨濠備簻闂佸憡绺块崕杈╃矆娴h櫣纾介柛灞捐壘閳ь剙鍢查湁闁搞儺鍓﹂弫瀣喐瀹ュ牏浜辨繝鐢靛█濞佳囶敄閸涘瓨瀚呴柣鏂垮悑閻撳繐鈹戦悙闈涗壕婵炲懎妫濋弻娑氣偓锝庝簼椤ャ垽鏌$仦鍓с€掑ù鐙呯畵瀹曟粏顦俊鎻掔墕椤啴濡堕崨瀵稿椽闂佺懓鍤栭幏锟�
        您的天气
          正在获取信息 ...
随笔 - 3458, 文章 - 0, 评论 - 739, 阅读 - 1188万
  管理

网络文件下载器 - C#小函数类推荐

Posted on   lzhdim  阅读(12076)  评论(0编辑  收藏  举报

       此文记录的是下载网络文件的操作类。

复制代码
/***

    网络文件下载器

    Austin Liu 刘恒辉
    Project Manager and Software Designer

    E-Mail: lzhdim@163.com
    Blog:   http://lzhdim.cnblogs.com
    Date:   2024-01-15 15:18:00

    使用方法:
        DownloadWebFileUtil.DownloadFile("https://lzhdim.cnblogs.com/default.html","d:\default.html"):

***/

namespace Lzhdim.LPF.Utility
{
    using System;
    using System.IO;
    using System.Net;
    using System.Text;
    using System.Net.Security;
    using System.Security.Cryptography.X509Certificates;

    /// <summary>
    /// 下载网页操作类
    /// </summary>
    public static class DownloadWebFileUtil
    {
        /// <summary>
        /// 同步下载方法,支持断点续传,计算下载速度,下载进度
        /// </summary>
        /// <param name="url">下载链接</param>
        /// <param name="savePath">文件保存路径,C://xxx.zip</param>
        /// <param name="progressCallBack">进度回调</param>
        /// <param name="downloadMsgCallBack">速度回调</param>
        /// <returns>true:下载成功,false:下载失败</returns>
        public static bool DownloadFile(string url, string savePath, Action<double> progressCallBack = null, Action<string> downloadMsgCallBack = null)
        {
            ServicePointManager.DefaultConnectionLimit = 50;
            string responseContent = "";
            HttpWebRequest httpWebRequest = null;
            try
            {
                if (string.IsNullOrEmpty(savePath))
                    return false;

                long rangeBegin = 0;//记录已经下载了多少
                if (File.Exists(savePath))
                    rangeBegin = new FileInfo(savePath).Length;

                if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
                    ServicePointManager.Expect100Continue = true;
                    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
                    httpWebRequest = WebRequest.Create(url) as HttpWebRequest;
                }
                else
                    httpWebRequest = (HttpWebRequest)WebRequest.Create(url);

                //httpWebRequest.Timeout = 300000;
                //httpWebRequest.ReadWriteTimeout = 60 * 1000;
                httpWebRequest.Method = "GET";
                httpWebRequest.KeepAlive = false;
                httpWebRequest.ServicePoint.Expect100Continue = false;
                httpWebRequest.Proxy = null;
                if (rangeBegin > 0)
                    httpWebRequest.AddRange(rangeBegin);

                using (HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
                {
                    using (Stream responseStream = httpWebResponse.GetResponseStream())
                    {
                        if (responseStream == null)
                            return false;
                        long totalLength = httpWebResponse.ContentLength;
                        if (totalLength == rangeBegin)
                        {
                            progressCallBack?.Invoke(100);
                            return true;
                        }
                        if (totalLength == 0 || rangeBegin > totalLength)
                        {
                            progressCallBack?.Invoke(0);
                            return false;
                        }

                        long offset = rangeBegin;
                        long oneSecondDonwload = 0;
                        var beginSecond = DateTime.Now.Second;
                        //savePath = Path.Combine(savePath, 
                      httpWebResponse.ResponseUri.LocalPath.Substring(
                               httpWebResponse.ResponseUri.LocalPath.LastIndexOf('/') + 1));
//自动获取文件名 using (Stream stream = new FileStream(savePath, FileMode.Append, FileAccess.Write)) { byte[] bArr = new byte[1024 * 8 * 1024]; int size = 0; while ((size = responseStream.Read(bArr, 0, (int)bArr.Length)) > 0) { try { stream.Write(bArr, 0, size); oneSecondDonwload += size; offset = offset + size; var endSencond = DateTime.Now.Second; if (beginSecond != endSencond) { string outSize = GetFileSizeTypeBySize(oneSecondDonwload / (endSencond - beginSecond)); downloadMsgCallBack?.Invoke($"{outSize}/S"); beginSecond = DateTime.Now.Second; oneSecondDonwload = 0; } progressCallBack?.Invoke(Math.Round((offset / (totalLength * 1.0)) * 100, 2)); } catch { return false; } } responseContent = savePath; } } httpWebResponse?.Close(); } } catch { responseContent = ""; return false; } finally { httpWebRequest?.Abort(); } return true; } /// <summary> /// 根据URL获取XML文档文本内容 /// </summary> /// <param name="URL">XML文件网址</param> /// <returns>XML文本内容</returns> internal static string GetWebXMLFile(string URL) { try { start: HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URL); req.Method = "GET"; req.Timeout = 60000; req.KeepAlive = true; req.AllowAutoRedirect = true; HttpWebResponse rps = (HttpWebResponse)req.GetResponse(); if (rps.StatusCode != HttpStatusCode.OK) { goto start; } Stream respStream = rps.GetResponseStream(); using (StreamReader reader = new StreamReader(respStream, Encoding.GetEncoding("utf-8"))) { //ReadToEnd方法不好使,有时候抛异常:无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接 //string text = reader.ReadToEnd(); string text = string.Empty; string line = string.Empty; while ((line = reader.ReadLine()) != null) { text += line; } reader.Close(); return text; } } catch { return string.Empty; } } #region 私有函数 /// <summary> /// 临时返回函数 /// </summary> /// <param name="sender"></param> /// <param name="certificate"></param> /// <param name="chain"></param> /// <param name="sslPolicyErrors"></param> /// <returns></returns> private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; } /// <summary> /// 获取文件大小 /// </summary> /// <param name="fileSize">文件大小</param> /// <returns>格式化后的文本</returns> private static string GetFileSizeTypeBySize(long fileSize) { if (fileSize < 1024) return $"{fileSize}B"; if (fileSize / 1024 < 1024) return $"{fileSize / 1024}KB"; if (fileSize / (1024 * 1024) < 1024) return $"{fileSize / (1024 * 1024)}MB"; else return $"{fileSize / (1024 * 1024 * 1024)}GB"; } #endregion 私有函数 } }
复制代码

 

相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-12-13 ESET防病毒软件 v17.1.11.0 - 安全
2014-12-13 jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章
2008-12-13 随笔 - 诚实
2025年3月3日 星期一 【蛇】己卯月辛未日 乙巳年 二月初四 全国爱耳日
您的IP:3.131.141.91,操作系统:未知操作系统,浏览器:未知浏览器
Copyright (C) 2000-2025 Lzhdim Software All Rights Reserved
点击右上角即可分享
微信分享提示