WPF下载远程文件,并显示进度条和百分比
1、xaml
<
ProgressBar
HorizontalAlignment="Left" Height="10" Margin="96,104,0,0" Name="pbDown" VerticalAlignment="Top" Width="100"/>
<
Label
Content="Label" Name="label1" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="206,104,0,0"/>
|
2、CS程序
using
System;
using
System.Windows;
using
System.Windows.Controls;
using
System.Net;
using
System.IO;
using
System.Threading;
using
System.Drawing;
namespace
WpfDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public
partial
class
MainWindow : Window
{
public
MainWindow()
{
InitializeComponent();
if
(HttpFileExist(
"http://183.62.138.31:57863/opt/resources/%E9%A3%8E%E6%99%AF/f1.jpg"
))
{
DownloadHttpFile(
"http://183.62.138.31:57863/opt/resources/%E9%A3%8E%E6%99%AF/f1.jpg"
,
@"d:\f1.jpg"
);
}
}
public
void
DownloadHttpFile(String http_url, String save_url)
{
WebResponse response =
null
;
//获取远程文件
WebRequest request = WebRequest.Create(http_url);
response = request.GetResponse();
if
(response ==
null
)
return
;
//读远程文件的大小
pbDown.Maximum = response.ContentLength;
//下载远程文件
ThreadPool.QueueUserWorkItem((obj) =>
{
Stream netStream = response.GetResponseStream();
Stream fileStream =
new
FileStream(save_url, FileMode.Create);
byte
[] read =
new
byte
[1024];
long
progressBarValue = 0;
int
realReadLen = netStream.Read(read, 0, read.Length);
while
(realReadLen > 0)
{
fileStream.Write(read, 0, realReadLen);
progressBarValue += realReadLen;
pbDown.Dispatcher.BeginInvoke(
new
ProgressBarSetter(SetProgressBar), progressBarValue);
realReadLen = netStream.Read(read, 0, read.Length);
}
netStream.Close();
fileStream.Close();
},
null
);
}
/// <summary>
/// 判断远程文件是否存在
/// </summary>
/// <param name="fileUrl">文件URL</param>
/// <returns>存在-true,不存在-false</returns>
private
bool
HttpFileExist(
string
http_file_url)
{
WebResponse response =
null
;
bool
result =
false
;
//下载结果
try
{
response = WebRequest.Create(http_file_url).GetResponse();
result = response ==
null
?
false
:
true
;
}
catch
(Exception ex)
{
result =
false
;
}
finally
{
if
(response !=
null
)
{
response.Close();
}
}
return
result;
}
public
delegate
void
ProgressBarSetter(
double
value);
public
void
SetProgressBar(
double
value)
{
//显示进度条
pbDown.Value = value;
//显示百分比
label1.Content = (value / pbDown.Maximum) * 100 +
"%"
;
}
}
}
|