代码如下:

    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带进度条的图片下载的更多相关文章

  1. 基于jQuery带进度条全屏图片轮播代码

    基于jQuery带进度条全屏图片轮播代码.这是一款基于jQuery实现的oppo手机官网首页带进度条全屏图片轮播特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div ...

  2. HTML5多图片拖拽上传带进度条

    前言 昨天利用css2的clip属性实现了网页进度条觉得还不错,但是很多情况下,我们在那些时候用进度条呢,一般网页加载的时候如果有需要可以用,那么问题就来了,怎么才算整个加载完毕呢,是页面主要模块加载 ...

  3. Android -- 自定义带进度条的按钮

    1. 实现了一个带进度条的按钮,完成后显示提示信息,并设置按钮为不可再次被点击

  4. PHP+ajaxForm异步带进度条上传文件实例

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: v ...

  5. 【Web】前端文件上传,带进度条

    最近做项目发现,在文件上传的过程中,增加进度条,能大大改善用户体验.本例介绍带进度条的文件上传 环境搭建 参考:[Java]JavaWeb文件上传和下载. 原生ajax上传带进度条 <%@ pa ...

  6. Asp.Net上传大文件带进度条swfupload

    Asp.Net基于swfupload上传大文件带进度条百分比显示,漂亮大气上档次,大文件无压力,先看效果 一.上传效果图 1.上传前界面:图片不喜欢可以自己换 2.上传中界面:百分比显示 3.上传后返 ...

  7. servlet多文件上传(带进度条)

    需要commons-fileupload-1.3.jar和commons-io-2.4.jar的支持 页面效果:(图片文件都可以) (1)进度标识类 public class UploadStatus ...

  8. 赞!带进度条的 jQuery 文件拖放上传插件

    jQuery File Uploader 是一个 jQuery 文件拖放上传插件,包括 Ajax 上传和进度条效果.作者编写这个插件的想法是要保持它非常简单,不像其他的插件,很多的标记,并提供一些 H ...

  9. atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

    atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...

随机推荐

  1. yum安装于卸载软件常见命令

    1.使用yum安装和卸载软件,有个前提是yum安装的软件包都是rpm格式的. 安装的命令是,yuminstall ~,yum会查询数据库,有无这一软件包,如果有,则检查其依赖冲突关系,如果没有依赖冲突 ...

  2. Android/Linux boot time优化

    基于analyze_boot.py分析Android/Linux的kernel boot时间 1.修改HiKey的BoardConfig.mk文件,使能initcall_debug,增加dmesg b ...

  3. OD: Memory Attach Technology - Off by One, Virtual Function in C++ & Heap Spray

    Off by One 根据 Halvar Flake 在“Third Generation Exploitation”中的描述,漏洞利用技术依攻击难度从小到大分为三类: . 基础的栈溢出利用,可以利用 ...

  4. .call()和.apply()相同点与不同点

    .call()和.apply()相同点与不同点 function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } add.call ...

  5. C++中的struct与class继承方式

    代码: #include <iostream> #include <cstdio> using namespace std; //class A{ struct A{ publ ...

  6. OOAD基本概念

    学习目标: 1.理解与掌握面向对象的概念与方法. 2.使用UML. 3.完成面向对象的分析与设计工作. 4.了解OO的设计原则及一些典型的设计模式 什么是面向对象? 面向对象(Object-Orien ...

  7. Repeater中添加按钮,点击按钮获取某一行的数据

    1.添加编辑按钮和删除按钮 <asp:Repeater ID="Repeater1" runat="server" onitemcommand=" ...

  8. 理解java的三大特性之多态(三)

    摘自:http://cmsblogs.com/?p=52 面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已 ...

  9. JDBC 基础概念

    1.概念:java与数据库连接 2.JDBC:是一个规范,提供接口(面向接口编程) 3.JDBC API:提供程序员调用的接口和类,集成在java.sql和javax.sql包中.如:DriverMa ...

  10. 一个ajax实现表单上传文件的神器 formdata

    通过传统的form表单提交的方式上传文件: $.ajax({ url : "http://localhost:8080/STS/rest/user", type : "P ...