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. 性能提升---分割小文件上传 ...
随机推荐
- windows身份验证,那么sqlserver的连接字符串的
Data Source=计算机名称或ip地址;Initial Catalog=数据库名称;Integrated Security=True windows身份验证不需要psw的Provider=SQL ...
- zip命令的使用
zip命令可以用来将文件压缩成为常用的zip格式.unzip命令则用来解压缩zip文件. 1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip: # zip -r yasuo ...
- windows internal读书笔记
程序:指一个静态的指令序列,而进程则是一个容器,其中包含了当执行一个程序特定实例时所用到的各种资源.
- SQL存储过程笔记
一.概述 存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它. 优点: ...
- java正则
package cn.stat.p4.ipdemo; import java.util.regex.Matcher; import java.util.regex.Pattern; public cl ...
- code first 尝试
建表: 1.先用EF连接数据库,配置connectionStrings <configSections> <!-- For more information on Entity Fr ...
- Android学习笔记--获取传感器信息
相关资料: 传感器的坐标与读数:http://www.cnblogs.com/mengdd/archive/2013/05/19/3086781.html 传感器介绍及指南针原理:http://www ...
- Linux的标准输出、标准错误输出、nohup
1.在bash中标准输出可以用1来表示:通常来说这个1可以省略: 如./xxx >/dev/null 和 ./xxx 1>/dev/null 是一个意思 2.在bash中标准错误输出可以用 ...
- 2016ICPC China-finals 题解
A:ans=n/3,因为8=1(mod7) B: C: D:二分+贪心,二分答案,即个数,check(mid)时贪心看能不能放成mid个; E:贪心,列出不等关系,然后写个高精度分数类; F:二分+h ...
- ububtu 彻底卸载程序的几种方法
sudo apt-get purge ......(点点为为程序名称) sudo apt-get autoremove sudo apt-get clean dpkg -l |grep ^rc|awk ...