C# winform带进度条的图片下载
代码如下:
public partial class FrmMain : Form
{
public FrmMain()
{
InitializeComponent();
} private void FrmMain_Load(object sender, EventArgs e)
{
btnDownload.FlatStyle = FlatStyle.Flat;
btnDownload.FlatAppearance.BorderSize = 0;
btnDownload.FlatAppearance.MouseOverBackColor = Color.LightSkyBlue;
btnDownload.FlatAppearance.MouseDownBackColor = Color.SkyBlue;
txtWebSiteUrl.Focus();
cmbRegexs.Items.AddRange(new string[]
{
"--请选择正确的正则表达式--",
"<img\\s+src=\"(.+)\"\\s+/>",
"<img\\s+src=\"(.+)\"\\s+border=\".+\"\\s+hspace=\".+\"\\s+smallsrc=\".+\"\\s+/>",
"<img\\s+src=\"(.+)\"\\s+alt=\"(.+)?\"\\s+style=\"(.+)?\"/>"
});
cmbRegexs.SelectedIndex = 0;
btnDownload.Click += new EventHandler(btnDownload_Click);
} void btnDownload_Click(object sender, EventArgs e)
{
try
{
string url = txtWebSiteUrl.Text.Trim();//网址
string regex = cmbRegexs.SelectedItem.ToString();//正则表达式 #region 基本信息验证 if (string.IsNullOrEmpty(url) || !Regex.IsMatch(url, "[a-zA-z]+://[^\\s]*", RegexOptions.ECMAScript)) { txtWebSiteUrl.Text = ""; txtWebSiteUrl.Focus(); /*提示太烦了,所以就定位*/ return; }
if (regex == "--请选择正确的正则表达式--") { MessageBox.Show("请选择正则表达式"); return; } #endregion string lofter_code = GetWebCode(url, Encoding.UTF8);//获取网页内容
MatchCollection matchcollection = Regex.Matches(lofter_code, regex);//查询匹配项
if (matchcollection.Count <= 0)
throw new Exception("该网页没有图片"); string Directory = string.Empty;//保存的文件夹 #region 获取文件夹路径 FolderBrowserDialog folder = new FolderBrowserDialog();//文件夹选择
folder.RootFolder = Environment.SpecialFolder.DesktopDirectory;//默认位置为桌面
folder.ShowNewFolderButton = true;//可以新建文件夹
if (folder.ShowDialog() == DialogResult.OK)
{
Directory = folder.SelectedPath;
btnDownload.Enabled = false; txtWebSiteUrl.Enabled = false; cmbRegexs.Enabled = false;/*禁用按钮和文本和下拉框*/
}
else return; #endregion int i = 0;
WebClient wc = new WebClient();
wc.Encoding = Encoding.UTF8;
foreach (Match item in matchcollection)
{
i++;
DownloadFile(item.Groups[1].Value, Path.Combine(Directory, GetPictureName(item.Groups[1].Value)), pbProgressBar);//不是很卡
//wc.DownloadFileAsync(item.Groups[1].Value, Path.Combine(Directory, GetPictureName(item.Groups[1].Value)));//速度快,但无法设置进度条,并且很卡
lblResult.Text = "还有【" + (matchcollection.Count - i) + "】张图片未下载";
}
lblResult.Text = "下载完成,共下载【" + matchcollection.Count + "】张图片";
btnDownload.Enabled = true; txtWebSiteUrl.Enabled = true; cmbRegexs.Enabled = true;/*启用按钮和文本和下拉框*/
}
catch (Exception ex)
{
btnDownload.Enabled = true; txtWebSiteUrl.Enabled = true; cmbRegexs.Enabled = true;/*启用按钮和文本和下拉框*/
lblResult.Text = "错误:" + ex.Message;
} } /// <summary>
/// 下载文件
/// </summary>
/// <param name="url">下载文件地址</param>
/// <param name="filename">下载后的存放地址</param>
/// <param name="prog">用于显示的进度条</param>
public static void DownloadFile(string url, string filename, System.Windows.Forms.ProgressBar prog)
{
try
{
System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
long totalBytes = myrp.ContentLength;
if (prog != null)
{
prog.Maximum = (int)totalBytes;
}
System.IO.Stream st = myrp.GetResponseStream();
System.IO.Stream so = new System.IO.FileStream(filename, System.IO.FileMode.Create);
long totalDownloadedByte = 0;
byte[] by = new byte[1024];
int osize = st.Read(by, 0, (int)by.Length);
while (osize > 0)
{
totalDownloadedByte = osize + totalDownloadedByte;
System.Windows.Forms.Application.DoEvents();
so.Write(by, 0, osize);
if (prog != null)
{
prog.Value = (int)totalDownloadedByte;
}
osize = st.Read(by, 0, (int)by.Length);
}
so.Close();
st.Close();
}
catch (System.Exception ex)
{
throw new Exception(ex.Message);
}
} /// <summary>
/// 获取指定网页的内容
/// </summary>
/// <param name="path">网页地址</param>
/// <param name="encoding">字符编码格式</param>
/// <returns></returns>
public static string GetWebCode(string path, Encoding encoding)
{
System.Net.WebRequest wr = System.Net.WebRequest.Create(path);
System.IO.Stream s = wr.GetResponse().GetResponseStream();
if (s == null) return null;
System.IO.StreamReader sr = new System.IO.StreamReader(s, encoding);
string all = sr.ReadToEnd();//读取网站的数据
sr.Close();
s.Close();
return all;
} /// <summary>
/// 获取图片名
/// </summary>
/// <param name="url">图片地址</param>
/// <returns></returns>
public static string GetPictureName(string url)
{
return url.Remove(0, url.LastIndexOf('/') + 1);
}
C# winform带进度条的图片下载的更多相关文章
- 基于jQuery带进度条全屏图片轮播代码
基于jQuery带进度条全屏图片轮播代码.这是一款基于jQuery实现的oppo手机官网首页带进度条全屏图片轮播特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- HTML5多图片拖拽上传带进度条
前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...
- Android -- 自定义带进度条的按钮
1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击
- PHP+ajaxForm异步带进度条上传文件实例
在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...
- 【Web】前端文件上传,带进度条
最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...
- Asp.Net上传大文件带进度条swfupload
Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ...
- servlet多文件上传(带进度条)
需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus ...
- 赞!带进度条的 jQuery 文件拖放上传插件
jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...
- atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...
随机推荐
- eclipse与github建立版本关联、git使用说明
1.在eclipse下建一个project :aa 2.打开git bush,进入aa目录下:cd /d/MyWorkspace/aa 3.git init 4.git add -A 5.git co ...
- tmux environment keep
Shell 下 tmux 不能保持 PATH 变量,解决方法如下: 添加如下配置信息到 ~/.tmux.conf 中即可. set-option -ga update-environment PATH ...
- css圆角
在CSS3中圆角属性,有四个.三个.两个和一个值. 四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下角.
- poj3685 二分套二分
F - 二分二分 Crawling in process... Crawling failed Time Limit:6000MS Memory Limit:65536KB 64bit ...
- uva 10107 - What is the Median?
#include <cstdio> #include <iostream> using namespace std; ]; int main() { int i, cur_in ...
- SDP (Session Description Protocol)
SDP的描述网络上一大堆中文的,可以看看RFC2327 SDP 信息是文本信息,采用 UTF-8 编 码中的 ISO 10646 字符集.SDP 会话描述如下:(标注 * 符号的表示可选字段): v ...
- C# 解析json Newtonsoft.Json
Newtonsoft.Json.dll public class ErrorInfo { public error_response error_response { get; set; } } pu ...
- 贴近浏览器窗口右侧的jqueryui dialog快速从左侧调整大小时对话框大小设置不准确的问题
之前在做两个相同的页面的事件同步时发现了这个问题,现在把它记录下来. 一.问题描述 页面中的jqueryui对话框,如果把它拖动到靠近浏览器窗口右侧边缘,并快速从对话框左侧调整对话框窗口大小时,对话框 ...
- 类和对象:继承 - 零基础入门学习Python038
类和对象:继承 让编程改变世界 Change the world by program 上节课的课后作业不知道大家完成的怎样?我们试图模拟一个场景,里边有一只乌龟和十条鱼,乌龟通过吃鱼来补充体力,当乌 ...
- Git学习笔记--Git常用命令
参考资料: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 mkdir myfir ...