廢話少說,先演示一張效果圖
簡單說下過程嘍
開發過程中其實總是會碰到項目想應用下載文件~
看其他語言有很多封裝好的類庫可以使用~~
作為小白的我並沒有找到很多c#的案例可參考
后找到一款“MutThreadDownLoadFile”的demo
但是每次使用感覺並不方便,另外可用信息可擴展不是特別強。。
然后重新改進並封裝了類庫的形式,可以簡單使用
貼出此demo的代碼看一下
public Form1() { InitializeComponent(); } DownLoadFile dlf = new DownLoadFile(); private void btnTest_Click(object sender, EventArgs e) { string[] lines = File.ReadAllLines("華軍軟件.txt"); for (int i = 0; i < lines.Length; i++) { string[] line = lines[i].Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries); if (line.Length == 2) { string path = Uri.EscapeUriString(line[1]); string filename = Path.GetFileName(path); string dir = @"D:\test"; ListViewItem item = listView1.Items.Add(new ListViewItem(new string[] { (listView1.Items.Count + 1).ToString(), filename, "0", "0", "0%", "0", "0", DateTime.Now.ToString(), "等待中", line[1] })); int id = item.Index; dlf.AddDown(path, dir, "", id); } } dlf.StartDown(); } private void Form1_Load(object sender, EventArgs e) { dlf.ThreadNum = 3;//線程數,不設置默認為3 dlf.doSendMsg += SendMsgHander;//下載過程處理事件 } private void SendMsgHander(DownMsg msg) { switch (msg.Tag) { case DownStatus.Start: this.Invoke((MethodInvoker)delegate () { listView1.Items[msg.Id].SubItems[8].Text = "開始下載"; listView1.Items[msg.Id].SubItems[7].Text = DateTime.Now.ToString(); }); break; case DownStatus.GetLength: this.Invoke((MethodInvoker)delegate () { listView1.Items[msg.Id].SubItems[3].Text = msg.LengthInfo; listView1.Items[msg.Id].SubItems[8].Text = "連接成功"; }); break; case DownStatus.End: case DownStatus.DownLoad: this.Invoke(new MethodInvoker(() => { this.Invoke((MethodInvoker)delegate () { listView1.Items[msg.Id].SubItems[2].Text = msg.SizeInfo; listView1.Items[msg.Id].SubItems[4].Text = msg.Progress.ToString()+"%"; listView1.Items[msg.Id].SubItems[5].Text = msg.SpeedInfo; listView1.Items[msg.Id].SubItems[6].Text = msg.SurplusInfo; if (msg.Tag == DownStatus.DownLoad) { listView1.Items[msg.Id].SubItems[8].Text = "下載中"; } else { listView1.Items[msg.Id].SubItems[8].Text = "下載完成"; } Application.DoEvents(); }); })); break; case DownStatus.Error: this.Invoke((MethodInvoker)delegate () { listView1.Items[msg.Id].SubItems[6].Text = "失敗"; listView1.Items[msg.Id].SubItems[8].Text = msg.ErrMessage; Application.DoEvents(); }); break; } }
應用時不考慮下載過程
只需要添加下載的文件
設定好下載線程以及最多每次下載幾個文件(默認為3)即可
希望這次的封裝,可以幫到其他需要應用到該類庫的朋友
由於時間的關系,只是花了兩天的時間測試和完善,可能很多地方考慮的並不是很周全(暫時沒發現太明顯bug)
大家可以應用並測試后反饋在這個地方,方便我們一起更好的完善它!