c#根据文件大小显示文件复制进度条实例

初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉。这里记录下,以防以后用到这方面的知识点。

窗体设计:

code:

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace CopyProgress015
{
public partial class Form1 : Form
{
    public Form1()
    {
 InitializeComponent();
    }
    private Thread thdCopyFile; //创建一个线程
    private string str = "";  //用来记录源文件的名字
    FileStream FormerOpenStream;  //实例化源文件FileStream类
    FileStream ToFileOpenStream;  //实例化目标文件FileStream类

#region //复制文件 函数
    /// <summary>
    /// 复制文件
    /// </summary>
    /// <param name="FormerFile">源文件路径</param>
    /// <param name="ToFile">目的文件路径</param>
    /// <param name="TranSize">传输大小</param>
    /// <param name="progressBar1">ProgressBar控件</param>
    public void CopyFile(string FormerFile, string ToFile, int TranSize, ProgressBar progressBar1)
    {
 progressBar1.Value = 0;//设置进度条的当前位置为0
 progressBar1.Minimum = 0; //设置进度条的最小值为0

try
 {
     FormerOpenStream = new FileStream(FormerFile, FileMode.Open, FileAccess.Read);//以只读方式打开源文件
 }
 catch (IOException ex)
 {
     MessageBox.Show(ex.Message);
     return;
 }

try
 {
     FileStream fileToCreate = new FileStream(ToFile, FileMode.Create); //创建目的文件,如果已存在将被覆盖
     fileToCreate.Close();//关闭所有fileToCreate的资源
     fileToCreate.Dispose();//释放所有fileToCreate的资源
 }
 catch(IOException ex)
 {
     MessageBox.Show(ex.Message);
     return;
 }

ToFileOpenStream = new FileStream(ToFile, FileMode.Append, FileAccess.Write);//以写方式打开目的文件

int max = Convert.ToInt32(Math.Ceiling((Double)FormerOpenStream.Length / (Double)TranSize));//根据一次传输的大小,计算最大传输个数. Math.Ceiling 方法 (Double),返回大于或等于指定的双精度浮点数的最小整数值。

progressBar1.Maximum = max;//设置进度条的最大值
 int FileSize; //每次要拷贝的文件的大小
 if (TranSize < FormerOpenStream.Length)  //如果分段拷贝,即每次拷贝内容小于文件总长度
 {
     byte[] buffer = new byte[TranSize]; //根据传输的大小,定义一个字节数组,用来存储传输的字节
     int copied = 0;//记录传输的大小
     int tem_n = 1;//设置进度栏中进度的增加个数
     while (copied <= ((int)FormerOpenStream.Length - TranSize))
     {
  FileSize = FormerOpenStream.Read(buffer, 0, TranSize);//从0开始读到buffer字节数组中,每次最大读TranSize
  FormerOpenStream.Flush();   //清空缓存
  ToFileOpenStream.Write(buffer, 0, TranSize); //向目的文件写入字节
  ToFileOpenStream.Flush();//清空缓存
  ToFileOpenStream.Position = FormerOpenStream.Position; //是源文件的目的文件流的位置相同
  copied += FileSize; //记录已经拷贝的大小
  progressBar1.Value = progressBar1.Value + tem_n; //增加进度栏的进度块
     }
     int leftSize = (int)FormerOpenStream.Length - copied; //获取剩余文件的大小
     FileSize = FormerOpenStream.Read(buffer, 0, leftSize); //读取剩余的字节
     FormerOpenStream.Flush();
     ToFileOpenStream.Write(buffer, 0, leftSize); //写入剩余的部分
     ToFileOpenStream.Flush();
 }
 else //如果整体拷贝,即每次拷贝内容大于文件总长度
 {
     byte[] buffer = new byte[FormerOpenStream.Length];
     FormerOpenStream.Read(buffer, 0, (int)FormerOpenStream.Length);
     FormerOpenStream.Flush();
     ToFileOpenStream.Write(buffer, 0, (int)FormerOpenStream.Length);
     ToFileOpenStream.Flush();

}
 FormerOpenStream.Close();
 ToFileOpenStream.Close();
 if (MessageBox.Show("copy finished") == DialogResult.OK)
 {
     progressBar1.Value = 0;
     txtOriginalFile.Clear();
     txtCopyFile.Clear();
     str = "";

}

}

#endregion

public delegate void CopyFile_Delegate(); //定义委托/托管线程
    /// <summary>
    /// 在线程上执行委托(设置托管线程函数)
    /// </summary>
    public void SetCopyFile()
    {
 //this.Invoke(new CopyFile_Delegate(RunCopyFile)); //对指定的线程进行托管
 //下面两行代码等同上面一行代码
 CopyFile_Delegate copyfile_delegate = new CopyFile_Delegate(RunCopyFile); //创建delegate对象
 this.Invoke(copyfile_delegate); //调用delegate           
    }

/// <summary>
    /// 设置线程,运行copy文件,它与代理CopyFile_Delegate应具有相同的参数和返回类型
    /// </summary>
    public void RunCopyFile()
    {
 CopyFile(txtOriginalFile.Text, txtCopyFile.Text + "\\" + str, 1024, progressBar1); //复制文件
 Thread.Sleep(0); //避免假死
 thdCopyFile.Abort();  //关闭线程

}

private void btnOriginalFile_Click(object sender, EventArgs e)
    {
 if (openFileDialog1.ShowDialog() == DialogResult.OK)  //打开文件对话框
 {
     txtOriginalFile.Text = openFileDialog1.FileName;  //获取源文件的路径
 }

}

private void btnCopyFile_Click(object sender, EventArgs e)
    {
 if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
 {
     txtCopyFile.Text = folderBrowserDialog1.SelectedPath;//获取目的文件的路径              
 }
    }

private void btnBeginToCopy_Click(object sender, EventArgs e)
    {

if (txtOriginalFile.Text.Trim() == string.Empty)
 {
     MessageBox.Show("OriginalFile cannot be empty!");
     return;

}
 else
 {
     str = txtOriginalFile.Text;//记录源文件的路径
     str = str.Substring(str.LastIndexOf('\\') + 1, str.Length - str.LastIndexOf('\\') - 1); //获取源文件的名称
 }

if (txtCopyFile.Text.Trim() == string.Empty)
 {
     MessageBox.Show("The Copyfile path cannot be empty!");
     return;
 }
 else
 {
     thdCopyFile = new Thread(new ThreadStart(SetCopyFile));
     thdCopyFile.Start();
 }

}

/// <summary>
    /// 给textbox增加tooltip
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void txtOriginalFile_MouseHover(object sender, EventArgs e)
    {
 ToolTip tooltip = new ToolTip();
 if (txtOriginalFile.Text.Trim() != string.Empty)
 {

tooltip.Show(txtOriginalFile.Text, txtOriginalFile);
 }
 else
 {
     tooltip.Hide(txtOriginalFile);
 }

}
    /// <summary>
    /// 给textbox增加tooltip
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void txtCopyFile_MouseHover(object sender, EventArgs e)
    {
 ToolTip tooltip = new ToolTip();
 if (txtCopyFile.Text.Trim() != string.Empty)
 {

tooltip.Show(txtCopyFile.Text, txtCopyFile);
 }
 else
 {
     tooltip.Hide(txtCopyFile);
 }

}

}
}

(0)

相关推荐

  • asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)

    在Web开发中,有很多可以上传的组件模块,利用HTML的File控件的上传也是一种办法,不过这种方式,需要处理的细节比较多,而且只能支持单文件的操作.在目前Web开发中用的比较多的,可能uploadify(参考http://www.uploadify.com/)也算一个吧,不过这个版本一直在变化,他们的脚本调用也有很大的不同,甚至调用及参数都一直在变化,很早的时候,那个Flash的按钮文字还没法变化,本篇随笔主要根据项目实际,介绍一下3.1版本的uploadify的控件使用,这版本目前还是最新的

  • C# Winform下载文件并显示进度条的实现代码

    方法一: 效果如下图所示: 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WinShowDown { public partial class F

  • C#中常使用进度条的代码

    复制代码 代码如下: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Diagnostics; using System.Threading; namespace WindowsApplication2 { /// <summary> /// 

  • C#实现带百分比的进度条功能示例

    本文实例讲述了C#实现带百分比的进度条功能.分享给大家供大家参考,具体如下: 功能需求: 如果程序中会执行一个耗时的计算过程,我想在用户点击按钮后,弹出一个进度条窗口,显示正在执行的进度(最好能带有百分比),执行完成后,进度条窗口关闭,回到主程序窗口. 在关闭子窗口之前父窗体不能点击操作. 实现方法: 先设计Form2进度条窗体,在Form2中央上放ProgressBar控件progressBar1和Label控件label1,代码: public partial class Form2 : F

  • C#实现带进度条的ListView

    推荐阅读:ListView 百分比进度条(delphi版) 对于已经有的组件,可以直接添加进来,添加后要先运行一下,然后会在工具箱内找到相应控件. 1.首先编写组件,然后将组件添加到工具箱内 编写代码如下: public partial class ListViewEx : System.Windows.Forms.ListView { public ListViewEx() { InitializeComponent(); } //C# listview进度条显示 private Color

  • c#进度条 progressBar 使用方法的小例子

    复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Mes.Core; namespace HCMDoImport{    public partial class ProcessBarForm : B

  • C#自定义音乐播放器进度条

    有些时候我们做的程序需要进度条,而vs提供的控件不是我们想要的.先看效果图: 进度条闪烁动画,当然背景可设为Transparent 之前想手绘进度条线条的,结果控件运行时会闪烁,所以直接用了panel控件 源码: [DefaultEvent("ProgressClick")] [ToolboxBitmap(typeof(TrackBar))] public partial class ProcessBar : UserControl { public ProcessBar() { //

  • c#根据文件大小显示文件复制进度条实例

    初学者,照着书上的抄袭制作,但已经理解了里面的意思和应用,并且进行了稍微改善和异常捕捉.这里记录下,以防以后用到这方面的知识点. 窗体设计: code: 复制代码 代码如下: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.

  • 使用Ajax实现简单的带百分比进度条实例

    需求:当进行文件长传保存等操作时,能在页面显示一个带百分比的进度条,给用户一个好的交互体验 实现步骤 JSP页面 1.添加table标签 <table id="load" width="700" border="0" align="center" bgcolor="#FAFAFA" cellpadding="0" cellspacing="0" borderco

  • Android Webview添加网页加载进度条实例详解

    推荐阅读:Android WebView线性进度条实例详解 最近在android项目中使用webview嵌套了一个抽奖活动网页,活动上线,运行良好(改了N次需求和突发bug),还好这种模式的活动,只需要修改网页,不需要重新打包发布市场,这也是这种模式开发的优势之一.后来据产品哥反馈说加载网页无进度提示,好吧,这个当时真没考虑这么多,这个要加加..想当然以为轻松搞定之....其实还是比轻松要复杂点... 1.首先自定义一个WebView控件 /** * 带进度条的Webivew * @author

  • Android WebView线性进度条实例详解

    推荐阅读:Android Webview添加网页加载进度条实例详解 先给大家展示下效果图:这个效果图大家一看就懂,在生活经常见到 1.wevbview_progressbar.xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 背景 --> <item android:id="@android:id/background"&g

  • Android自定义View实现带数字的进度条实例代码

    第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 第二步.自定义ProgressBar实现带数字的进度条 0.项目结构 如上图所示:library项目为自定义的带数字的进度条NumberProgressBar的具体实现,demo项目为示例项目以工程依赖的方式引用library项目,然后使用自定义的带数字的进度条NumberProgressBar来做展示 如上图所示:自定义的带数字的进度条的library项目的结构图 如上图所示:de

  • jQuery多文件异步上传带进度条实例代码

    先给大家展示下效果图: ///作者:柯锦 ///完成时间:2016.08.16 ///多文件异步上传带进度条 (function ($) { function bytesToSize(bytes) { if (bytes === 0) return '0 B'; var k = 1024, // or 1000 sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], i = Math.floor(Math.log(bytes)

  • Android自定义进度条的圆角横向进度条实例详解

    1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色,第二层为灰色,最上一层为进度条颜色,示例图如下: 3.效果图   实现圆角进度条还有很多其他方法,比如在Progress控件里填充圆角图片,通过拉伸图片来达到预想的效果,虽然听起来很简单,但实现起来还是有些麻烦的. 4.解说方法 (1)invalidate()方法 invalidate()是用来刷新

  • nodejs 终端打印进度条实例代码

    1. 场景导入 当我们对大量文件进行批量处理的时候(例如:上传/下载.保存.编译等),常常希望知道当前进展如何,或者失败(成功)的任务有多少:当我们的代码或程序已经发布,用户在执行安装的过程中,一个合适的(终端/命令行)进度条可以准确反映安装的步骤和进程,提升程序的可用性,一定程度缓解用户在等待中的烦恼-- 2. 基本原理 首先,在终端打印出文本是件比较容易的事情.那么使用简单的文本和符号,就够自己拼凑出命令行的效果(下面例子): 文件已上传: 43.60% ██████████████████

  • springMVC+ajax实现文件上传且带进度条实例

    前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name="filename" value= ""/></p > <p >上传文件: <input type="file" name="file"/></ p> <input ty

  • ios开发加载webview显示进度条实例

    很多APP加载webView页面的时候都有进度条显示,今天我们这里主要使用相对轻量级的WKWebView加载网页,至于WKWebView 和UIWebView的区别与联系这里就不多讲了,自己百度哈哈... WKWebView加载网页进度跳显示主要效果如下: 这里主要是使用KVO监听WKWebView的"estimatedProgress"属性,通过监听该属性的变化才是进度条的长度. 1.定义便利构造函数.以及属性和控件 var url: String? var progresslaye

随机推荐