C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Копирование Файлов с использованием ПрогрссБар, Как копировать файлы с ПрогрессБар
** User
  Отправлено: 18.02.2005, 14:37


Не зарегистрирован







Срочно Помогите горит проект...

К примеру есть некая форма с кнопкой (Копировать) и двумя
ПрогресБар'ами (ПрогресБар1 и ПрогресБар2) пусть по нажатию кнопкой (Копировать) запускается функция WinAPI копир. файл., мне нужно чтобы по началу копирования считываемый файл представлялся как некая переменная (точее его длина — размер) и по окончанию копир. ПрогресБар1 заполнялся полностью и затем обнулялся а ПрогресБар2 продвигался бы на опреденный процент от общего числа (точее их длины — размера) копируемых файлов, и так далее пока процесс копировония файлов не закончится и ПрогресБар2 не заполнится полностью и обнулится, тогда пороизойдёт следующие системное событие... sad.gif
Gedeon
Отправлено: 18.02.2005, 15:50


Ветеран

Группа: Модератор
Сообщений: 1742



Вот нить которая осущесвляет копирование измененных файлов из одной папки в другую и показывает прогресс на форме
CODE

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop


#include "U_CopyThread.h"
#include "U_FileBackUp.h"
//#define __PSAPI__
#include "Od_Functions.h"
#include <IdGlobal.hpp>
#pragma package(smart_init)


//---------------------------------------------------------------------------

//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall CopyThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
int CurrentPos;
DWORD CALLBACK CopyProgressRoutine(     LARGE_INTEGER TotalFileSize,
                                       LARGE_INTEGER TotalBytesTransferred,
                                       LARGE_INTEGER StreamSize,
                                       LARGE_INTEGER StreamBytesTransferred,
                                       DWORD dwStreamNumber,
                                       DWORD dwCallbackReason,
                                       HANDLE hSourceFile,
                                       HANDLE hDestinationFile,
                                       LPVOID lpData);

//---------------------------------------------------------------------------
__fastcall CopyThread::CopyThread(bool CreateSuspended)
   : TThread(CreateSuspended)
{
count = 0;
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::Execute()
{
   StatusCaption = "Ïîñòðîåíèå ñïèñêà êîïèðóåìûõ ôàéëîâ...";
   Synchronize(UpdateCaption);

   AnsiString SourceFolder = F_FileBackUp->Ed_Source->Text;
   AnsiString DestFolder = F_FileBackUp->Ed_Destination->Text;

   TSearchRec sr;
   TotalSize = 0;
   if(!(SourceFolder.IsEmpty())||(DestFolder.IsEmpty())){

       if(!FindFirst(SourceFolder+"\\*.*",faAnyFile,sr))
           do{
               if(Terminated){
                   FindClose(sr);
                   return;
               }
               if(!(sr.Name=="."  || sr.Name==".."))// ýòî êîïèðîâàòü íå íàäî
                   if(sr.Attr == faDirectory){
                       //
                   }
                   else{ // èíà÷å íàéäåí ôàéë
                       int SDate, DDate;
                       SDate = FileAge(SourceFolder+"\\"+sr.Name);
                       DDate = FileAge(DestFolder+"\\"+sr.Name);
                       if(SDate!=DDate){
                           SCopy SC;
                           SC.SFile = SourceFolder+"\\"+sr.Name;
                           SC.DFile = DestFolder+"\\"+sr.Name;
                           SC.Size = FileSizeByName(SC.SFile);
                           TotalSize += SC.Size;
                           FilesCopy.push_back(SC);

                           AddingFile = sr.Name;
                           Synchronize(AddFile);
                       }
                   }
           }
           while (!FindNext(sr));// èùåì îïÿòü, ïîêà íå íàéäåì âñå
           FindClose(sr);
   }
   StatusCaption = "Ïîäãîòîâêà ê êîïèðîâàíèþ ôàéëîâ...";
   Synchronize(UpdateCaption);

   Synchronize(SetTotal);
   for(unsigned int counter=0; counter<FilesCopy.size(); counter++){
       if(Terminated){
           break;
       }

       StatusCaption = "Êîïèðóåòñÿ ôàéë " + ExtractFileName(FilesCopy[counter].SFile);
       Synchronize(UpdateCaption);
       CurrentSize = FilesCopy[counter].Size;
       Synchronize(SetCurrent);

       if(!CopyFileEx( FilesCopy[counter].SFile.c_str(),
                       FilesCopy[counter].DFile.c_str(),
                       CopyProgressRoutine,
                       NULL,
                       NULL,
                       NULL)) ShowMessage("Error copying file " + FilesCopy[counter].SFile);
       CopiedFile = counter;
       Synchronize(ChekFile);

   }

   StatusCaption = "Îïåðàöèÿ îêîí÷åíà";
   Synchronize(UpdateCaption);
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::UpdateCaption()
{
   F_FileBackUp->StatusBar1->SimpleText = StatusCaption;
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::AddFile()
{
   F_FileBackUp->LB_FilesPassed->Items->Insert(F_FileBackUp->LB_FilesPassed->Items->Count,AddingFile);
   SendMessage(F_FileBackUp->LB_FilesPassed->Handle,WM_VSCROLL,SB_BOTTOM,NULL);

}
//---------------------------------------------------------------------------
void __fastcall CopyThread::SetTotal()
{
   F_FileBackUp->ProgressBar2->Max = TotalSize;
   SendMessage(F_FileBackUp->LB_FilesPassed->Handle,WM_VSCROLL,SB_TOP,NULL);
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::SetCurrent()
{
   F_FileBackUp->ProgressBar1->Max = CurrentSize;
}
//---------------------------------------------------------------------------
DWORD CALLBACK CopyProgressRoutine(
                                   LARGE_INTEGER TotalFileSize,
                                   LARGE_INTEGER TotalBytesTransferred,
                                   LARGE_INTEGER StreamSize,
                                   LARGE_INTEGER StreamBytesTransferred,
                                   DWORD dwStreamNumber,
                                   DWORD dwCallbackReason,
                                   HANDLE hSourceFile,
                                   HANDLE hDestinationFile,
                                   LPVOID lpData
){

   CurrentPos = (int)(TotalBytesTransferred.QuadPart);
   F_FileBackUp->CT->SynPos();
   return PROGRESS_CONTINUE;
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::SetPosition()
{

   F_FileBackUp->ProgressBar2->Position = F_FileBackUp->ProgressBar2->Position + CurrentPos — F_FileBackUp->ProgressBar1->Position;
   F_FileBackUp->ProgressBar1->Position = CurrentPos;
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::SynPos(){

   Synchronize(SetPosition);
}
//---------------------------------------------------------------------------
void __fastcall CopyThread::ChekFile(){

   count++;
   F_FileBackUp->LB_FilesPassed->Items->Strings[CopiedFile] = F_FileBackUp->LB_FilesPassed->Items->Strings[CopiedFile]+" — OK";
   for(int files=0; files<count; files++)
    SendMessage(F_FileBackUp->LB_FilesPassed->Handle,WM_VSCROLL,SB_LINEDOWN,NULL);
}
//---------------------------------------------------------------------------


Короче CopyFileEx.

Вернуться в Вопросы программирования в C++Builder