文件复制过程中显示进度条(九)

 

文件复制过程中显示进度条 ( )
本文讲述如何在文件复制过程中显示进度条。
1.      创建一个对话框工程: CopyFileProcessor
2.      添加一个文本框,用来显示浏览出来的源文件路径,添加一个按钮“浏览”,来选择源文件,如下:
       CFileDialog log ( TRUE , " 文件 " , "*.*" , OFN_HIDEREADONLY , "FILE(*.*)|*.*||" , NULL );
       if ( log . DoModal ()== IDOK )
       {
              pathname = log . GetPathName ();
              strname = log . GetFileName ();
              GetDlgItem ( IDC_EDADD )-> SetWindowText ( pathname );
       }
3.      添加一个文本框来显示浏览出来的目标存放路径,添加一个按钮“浏览”,来选择目标存放路径,如下:
       if ( strname . IsEmpty ())
              return ;
       BROWSEINFO bi ;  
       char buffer [ MAX_PATH ];  
       ZeroMemory ( buffer , MAX_PATH );  
       bi . hwndOwner = GetSafeHwnd ();  
       bi . pidlRoot = NULL ;  
       bi . pszDisplayName = buffer ;  
       bi . lpszTitle = " 选择一个文件夹 " ;  
       bi . ulFlags = BIF_EDITBOX ;  
       bi . lpfn = NULL ;  
       bi . lParam =0;  
       bi . iImage =0;
       LPITEMIDLIST pList = NULL ;  
       if (( pList = SHBrowseForFolder (& bi ))!= NULL )  
       {  
              char path [ MAX_PATH ];
              ZeroMemory ( path , MAX_PATH );
              SHGetPathFromIDList ( pList , path );
              fullname = path ;
              if ( fullname . Right (1)!= "//" )
                     fullname . Format ( "%s//%s" , path , strname );
              else
                     fullname . Format ( "%s%s" , path , strname );
              GetDlgItem ( IDC_EDDEST )-> SetWindowText ( fullname );
       }
4.      添加一个进度条控件,添加一个按钮“复制”,代码如下:
       if ( pathname . IsEmpty ())
              return ;
       if ( fullname . IsEmpty ())
              return ;
       readfile = new CFile ( pathname , CFile :: modeRead );
       HANDLE hfile = :: CreateFile ( fullname , GENERIC_WRITE | GENERIC_READ ,0,0, CREATE_NEW , FILE_ATTRIBUTE_NORMAL ,0);
       CloseHandle ( hfile );
       writefile = new CFile ( fullname , CFile :: modeWrite );
       filelen = readfile -> GetLength ();
       ldiv_t r ;
       r = ldiv ( filelen ,100);
       long pos = r . quot ;
       long ipos ;
       ipos = pos ;
       int i = 0;
       hGlobal = GlobalAlloc ( GMEM_MOVEABLE ,512);
       pvData = GlobalLock ( hGlobal );
       while (1)
       {
              ZeroMemory ( pvData ,512);
              readlen = readfile -> ReadHuge ( pvData ,512);
              poslen = readfile -> GetPosition ();
              if ( poslen > ipos )
              {
                     ipos += pos ;
                     i ++;
              }
              m_fileproc . SetPos ( i );
              m_fileproc . Invalidate ();
              writefile -> WriteHuge ( pvData , readlen );
              if ( poslen == filelen )
                     break ;
       }
       AfxMessageBox ( " 复制完成 " );
       m_fileproc . SetPos (0);
       GlobalUnlock ( hGlobal );
       readfile -> Close ();
       writefile -> Close ();
注意,其中有些变量的声明如下:
       CString strname ;
       CString fullname ;
       CString pathname ;
       HGLOBAL hGlobal ;
       CFile * writefile ;
       CFile * readfile ;
       long readlen , poslen , filelen ;
       LPVOID pvData ;
并在构造函数中初始化,如下:
       readfile = NULL ;
       writefile = NULL ;
       pvData = NULL ;
完成。
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值