zoukankan      html  css  js  c++  java
  • 多线程拷贝(二)

    今天写一个我们复制文件时常用到的小程序,弄清其中多线程的原理,你就不会再烦恼为什么边复制,窗体还能边动态显示进程、在复制过程还能移动窗口等异步显示的问题,希望能对大家有所帮助。

    制作进度条

    若源文件不存在:

    若源文件已存在:

    若文件不存在会显示进度条:

    好了我们就可以把它拖到一边喽,让他自己慢慢复制吧,嗯好了,那我们就看看怎么让它来实现吧代码如下:

    View Code
     1 using System.IO;
     2 using System.Threading;
     3 namespace ThreadCopy
     4 {
     5     public partial class Form1 : Form
     6     {
     7         public Form1()
     8         {
     9             InitializeComponent();
    10             //允许线程间互相访问
    11             CheckForIllegalCrossThreadCalls = false;
    12         }
    13 
    14         private void CpyBtn_Click(object sender, EventArgs e)
    15         {
    16             
    17             Thread thread = new Thread(this.CopyFile);
    18             thread.Start();
    19 
    20         }
    21         private void CopyFile()
    22         {
    23             FileStream readStream = null;
    24             FileStream writeStream = null;
    25             string sfile = this.STB.Text.Trim();
    26             string mfile = this.MTB.Text.Trim();
    27             if (!File.Exists(sfile))
    28             {
    29                 MessageBox.Show("源文件不存在");
    30                 return;
    31             }
    32             using (readStream = File.Open(sfile, FileMode.Open))
    33             {
    34 
    35                 if (File.Exists(mfile))
    36                 {
    37                     DialogResult dr = MessageBox.Show("是否要覆盖文件", "警告", 
    38 
    39 MessageBoxButtons.OKCancel);
    40                     if (dr == DialogResult.OK)
    41                     {
    42                         writeStream = File.Open(mfile, FileMode.Truncate);
    43                     }
    44                     else
    45                     {
    46                         return;
    47                     }
    48                 }
    49                 else
    50                 {
    51                     writeStream = File.Open(mfile, FileMode.Create);
    52                 }
    53                 using (writeStream)
    54                 {
    55                     byte[] buffer = new byte[1024 * 4];
    56                     int i = 0;
    57                     long count = readStream.Length;
    58                     int ri = 0;
    59                     string ps = "";
    60                     while ((i = readStream.Read(buffer, 0, buffer.Length)) != 0)
    61                     {
    62                         writeStream.Write(buffer, 0, i);
    63                         ri = ri + i;
    64 //进度比率
    65                         ps = ((double)ri / count * 100).ToString("0.0") + "%";
    66                         this.PSLB.Text = ps;
    67 //源文件的大小
    68                         this.CLB.Text = (count/1024/1024)+"MB".ToString();
    69                         this.CpyPB.Maximum = (int)count;
    70                         this.CpyPB.Value = ri;
    71 //复制完成
    72                         if (ri == count)
    73                         {
    74                             this.CpyPB.Value = 0;
    75                         }
    76                     }
    77 
    78                 }
    79             }  
    80         }
    81     }
    82 }

    代码没有写什么注释,还请大家谅解。不过有了以上简单的几个步骤,我们就拥有了自己简单的多线程拷贝小程序了,虽然有点...,可毕竟是自己设计的,对它的原理也有深刻的理解,况且其复制,拖动,显示进程和文件总大小的功能也都具备,所以还应算作一个不如人意的复制小程序……没事,多多努力..加油

  • 相关阅读:
    iOS UIWebView中javascript与Objective-C交互、获取摄像头
    iOS UIWebView中javascript与Objective-C交互、获取摄像头
    android使用webview上传文件(支持相册和拍照)
    在Android浏览器中通过WebView调用相机拍照/选择文件 上传到服务器
    Android 访问权限设置
    perl 登入人人网
    攻击排查脚本
    利用套打和分栏巧妙来做商品价签
    perl 自定义请求头
    获取响应头信息
  • 原文地址:https://www.cnblogs.com/QLJ1314/p/2633770.html
Copyright © 2011-2022 走看看