带进度条的文件拷贝

 带进度条的文件拷贝

  可以拷贝任何文件,拷贝过程有进度条实时反映,并记录使用时间.

  显示效果如图:


  private void btnCopyFile_Click(object sender, System.EventArgs e)
  {
   Nexsmart.MMS.FileManager.Class.CopyFileWorker cfw=new Nexsmart.MMS.FileManager.Class.CopyFileWorker();
   string SourceFile=txtSourceFile.Text.Trim();
   string AimFile=txtAimFile.Text.Trim();

   if(!System.IO.File.Exists(SourceFile))
   {
    MessageBox.Show("源文件不存在","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
    if(txtSourceFile.CanFocus)
     txtSourceFile.Focus();
    return ;
   }

   if(false)//!CheckFilePath)
   {
    MessageBox.Show("目标文件路径不正确!","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
    if(txtAimFile.CanFocus)
     txtAimFile.Focus();
    return ;
   }

   cfw.SourceFile=txtSourceFile.Text;
   cfw.AimFile=txtAimFile.Text;

   cfw.OnCopyFile+=new Nexsmart.MMS.FileManager.Class.CopyFileWorker.CopyFileEventHandler(cfw_OnCopyFile);
   cfw.WorkOvered+=new Nexsmart.MMS.FileManager.Class.CopyFileWorker.WorkOverEventHandler(cfw_WorkOvered);

   System.Threading.Thread thread=new System.Threading.Thread(new  System.Threading.ThreadStart(cfw.CopyFile));//后台线程
   thread.Start();
   timer1.Enabled=true;//启动计数器
   timer1.Start();
   
  }

  private void cfw_OnCopyFile(long lngHad, long lngCount,string strShow)
  {
   this.pbarCopyFile.Maximum=(int)lngCount;
   this.pbarCopyFile.Value=(int)lngHad;

   this.lblHad.Text= Convert.ToString(lngHad/1024)+" KB";
   this.lblCount.Text=Convert.ToString(lngCount/1024)+" KB"; 
 
   lblShow.Text=strShow;
  }

  private void cfw_WorkOvered()
  {
   this.pbarCopyFile.Value=0;
   this.pbarCopyFile.Visible=false;
   SoureFile="";
   timer1.Enabled=false;
   timer1.Stop();//关闭计数器
   elapse=0;//清零计数变量
   lblShow.Text="";//清空显示
   MessageBox.Show("文件复制完成","",MessageBoxButtons.OK,MessageBoxIcon.Information);
   
  }
  private void timer1_Tick(object sender, System.EventArgs e)
  {
   ++elapse;
   lblTime.Text=elapse.ToString()+" 秒";
  }

//实现类

public class CopyFileWorker
 {
  public delegate void CopyFileEventHandler(long lngHad,long lngCount,string strShow);//定义一个委托
  public event CopyFileEventHandler OnCopyFile;//定义一个事件,在Copy文件时触发
  
  public delegate void WorkOverEventHandler();//定义一个委托
  public event WorkOverEventHandler WorkOvered;//定义一个事件,在Copy文件完成时触发

  public CopyFileWorker()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public CopyFileWorker(string source,string aim)
  {
   _sourceFile=source;
   _aimFile=aim;
  }
  private string _sourceFile;//源文件路径
  public string SourceFile
  {
   get
   {
    return  _sourceFile;
   }
   set
   {
    _sourceFile=value;
   }
  }
  private string _aimFile;//目标文件路径
  public string AimFile
  {
   get
   {
    return _aimFile;
   }
   set
   {
    _aimFile=value;
   }
  }
  /// <summary>
  /// 二进制读取文件,任何文件
  /// </summary>
  public void CopyFile()
  {
   byte[] bytTemp=new byte[4096];//字节数组

   long lngHad=0;
   long lngCount;
   int z=5000;
   
   //源文件流
   System.IO.FileStream fsSource=new System.IO.FileStream(SourceFile,System.IO.FileMode.Open,System.IO.FileAccess.Read,System.IO.FileShare.Read,4);
   //二进制读取器
   System.IO.BinaryReader bRead=new System.IO.BinaryReader(fsSource);
   //定位源文件流的头部
   bRead.BaseStream.Seek(0,System.IO.SeekOrigin.Begin);
   if(fsSource.Position>0)
    fsSource.Position=0;

   lngCount=fsSource.Length;

   if(System.IO.File.Exists(AimFile))
    System.IO.File.Delete(AimFile);

   //目标文件流
   System.IO.FileStream fsAim=new System.IO.FileStream(AimFile,System.IO.FileMode.CreateNew,System.IO.FileAccess.Write,System.IO.FileShare.Write,4);
   //二进制写入器
   System.IO.BinaryWriter bWrite=new System.IO.BinaryWriter(fsAim);

   while(z>=4096)
   {
    z=(int)bRead.Read(bytTemp,0,bytTemp.Length);//读入字节数组,返回读取的字节数量,如果小于4096,则到了文件尾
    bWrite.Write(bytTemp,0,bytTemp.Length);//从字节数组写入目标文件流
    
    lngHad+=z;
    string show="从"+SourceFile+"到"+AimFile;
    OnCopyFile(lngHad,lngCount,show);//触发事件 来控制主线程 这里是进度条和已完成复制文件字节显示   
   }

   bWrite.Flush();//清理缓存区

   bWrite.Close();
   bRead.Close();

   fsAim.Close();
   fsSource.Close();

   WorkOvered();//触发事件,调用完成复制后的处理程序

  }
 }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: qt多线程文件拷贝进度条程序的下载,在这里我将简单介绍一下实现的思路与步骤。 首先,在使用Qt进行多线程文件拷贝进度显示之前,我们需要引入Qt的相关头文件,例如QFile、QThread等。 接下来,我们需要创建一个自定义的线程类,继承自QThread。在这个线程类中,我们需要重写run()函数,在run()函数中实现文件拷贝操作。具体的拷贝操作可以使用QFile类中的copy()函数。 为了实现进度条的显示,我们可以通过信号与槽机制来实现。我们可以在自定义的线程类中定义一个信号,用来传递文件拷贝进度。可以使用QFile类的size()函数获取文件的总大小,然后在每次拷贝一个块的时候,发送一个信号,参数为已拷贝的字节数,通过计算已拷贝字节数和文件总大小的比例,来计算拷贝进度。 在主线程或主窗口类中,我们需要创建一个进度条控件用于显示拷贝进度。然后连接自定义的线程中的信号与主线程中的槽函数,以更新进度条进度。 在点击开始拷贝按钮的时候,我们需要创建一个自定义的线程对象,并调用start()函数启动线程。然后在槽函数中处理接收到的信号,更新进度条进度。 以上就是实现qt多线程文件拷贝进度条程序的简要步骤。通过多线程的方式进行文件拷贝,可以使程序在拷贝较大文件时不会出现界面卡顿的情况,同时通过进度条可以直观地显示拷贝进度。 ### 回答2: 对于Qt多线程文件拷贝进度条程序的下载,我们可以采用如下步骤: 1. 首先,在Qt中创建一个新的工程,添加一个进度条控件和一个按钮控件。 2. 在主线程中点击按钮事件的槽函数中,创建一个新的子线程,并传递需要拷贝文件路径和目标路径作为参数。 3. 在子线程中,使用Qt的文件操作类QFile进行文件拷贝。通过打开源文件,创建目标文件复制文件内容到目标文件中,实现文件拷贝的功能。 4. 在拷贝文件的过程中,可以在子线程中实时更新进度条的值,并通过信号和槽机制将进度条的值传递给主线程。 5. 在主线程中,接收并处理来自子线程的进度条值变化的信号,实时更新界面上的进度条的显示。 6. 当文件拷贝完成后,子线程发送一个完成信号给主线程,主线程处理该信号,提示文件拷贝已完成。 7. 最后,通过Qt的信号和槽机制,将按钮的点击事件和文件拷贝的相关操作进行连接,使得点击按钮时可以启动文件拷贝进度条程序的下载。 通过以上步骤,我们可以实现一个基于Qt多线程、进度条文件拷贝程序。用户可以通过点击界面上的按钮来触发拷贝过程,并实时显示拷贝进度。这样可以提高文件拷贝的效率,并提供更好的用户体验。 ### 回答3: Qt是一种跨平台的C++应用程序开发框架,它提供了丰富的功能库和工具,可以帮助开发者快速构建各种类型的应用程序。在Qt中,我们可以使用多线程来实现文件拷贝功能,并在界面上显示一个进度条,以便用户能够清楚地了解文件拷贝进度。 首先,我们需要创建一个继承自QThread的自定义类,用于执行文件拷贝的操作。在这个类中,我们可以重写run()函数,在函数中执行拷贝文件的逻辑。在拷贝文件的过程中,我们可以通过信号机制来实时发送拷贝进度给主线程。 在主线程中,我们可以创建一个进度条控件,并与自定义的文件拷贝线程进行连接。当文件拷贝线程发送进度信号时,我们可以更新进度条的值,让用户能够实时观察到文件拷贝进度。 同时,我们还可以提供一些用户交互的功能,比如添加文件、选择目标文件夹等。这些功能可以通过Qt的信号与槽机制来实现,用户可以触发相应的信号,然后我们在槽函数中执行相应的操作,比如选择文件,选择目标文件夹等。 除此之外,为了防止文件拷贝操作过程中出现的各种异常情况,我们还可以在文件拷贝线程中进行错误处理和异常捕获,并通过信号与槽机制向主线程发送错误信息,以便及时通知用户。 总而言之,通过Qt多线程和信号与槽机制,我们可以简单地实现一个多线程文件拷贝进度条程序的下载功能。这样用户可以在界面上直观地看到文件拷贝进度,并能够通过界面交互实现文件选择和目标文件夹选择等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值