** User |
Отправлено: 18.02.2005, 14:37 |
|
Не зарегистрирован
|
Срочно Помогите горит проект...
К примеру есть некая форма с кнопкой (Копировать) и двумя
ПрогресБар'ами (ПрогресБар1 и ПрогресБар2) пусть по нажатию кнопкой (Копировать) запускается функция WinAPI копир. файл., мне нужно чтобы по началу копирования считываемый файл представлялся как некая переменная (точее его длина — размер) и по окончанию копир. ПрогресБар1 заполнялся полностью и затем обнулялся а ПрогресБар2 продвигался бы на опреденный процент от общего числа (точее их длины — размера) копируемых файлов, и так далее пока процесс копировония файлов не закончится и ПрогресБар2 не заполнится полностью и обнулится, тогда пороизойдёт следующие системное событие... |
|
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.
|
|
|