Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 16.09.2011
Сообщений: 17

Визуальное копирование с прогрессбаром

13.10.2011, 13:51. Показов 3075. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Замучался я уже прикреплять ProgressBar к процессу копирования((( Может кто из знающих поможет? Очень на вас надеюсь! Заранее спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <SysUtils.hpp>
#include <vcl\Clipbrd.hpp>
#include <vcl.h>
#pragma hdrstop
#include "copy4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include "math.h"
 
using namespace std;
 
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 void FolderSize(AnsiString Folder,int &Size,int &fCount,int &folCount)
  {
//Ôóíêöèÿ çàïèñûâàåò â ïàðàìåòðû Size - ðàçìåð ïàïêè â áàéòàõ
//fCount - îáùåå êîëè÷åñòâî ôàéëîâ â ïàïêå
//folCount - îáùåå êîëè÷åñòâî ïîäïàïîê â ïàïêå
 
  TSearchRec SR; 
//Ïðîâåðÿåì, çàêàí÷èâàåòñÿ ëè ïóòü ê ïàïêå íà \, åñëè äà, òî óäàëÿåì åãî,
  if(Folder[Folder.Length()] == '\\') 
     Folder.SetLength(Folder.Length()-1);
  if(FindFirst(Folder+"\\*.*",faAnyFile,SR) == 0)//Äåëàåì ïåðâûé ïîèñê
   do 
      {  //Åñëè òî ÷òî ìû íàøëè íå ÿâëÿåòñÿ îáðàòíûìè ññûëêàìè...
         if(SR.Name != "." &&  SR.Name != "..")
         {  //Åñëè òî ÷òî ìû íàøëè ÿâëÿåòñÿ ïàïêîé, ôóíêöèÿ âûçûâàåò ñàìó ñåáÿ
//è óâåëè÷èâàåò ñ÷åò÷èê êîë-âà ïîäïàïîê
            if((SR.Attr & faDirectory)!=0)
               {
                  FolderSize(Folder+"\\"+SR.Name,Size,fCount,folCount); 
                  folCount++; 
               }
            else //Åñëè ýòî ôàéë - ïðèáàâëÿåì åãî ðàçìåð ê îáùåìó ðàçìåðó
               { 
                  Size = Size + SR.Size;
                  fCount++;
               }
         } 
      } 
   while(FindNext(SR)==0);
    FindClose(SR);
  }
 
 
 void CopyDirectory (AnsiString Src, AnsiString Dest,int d, TProgressBar* bar)
{
int i=1;
  TSearchRec sr;
  if (FindFirst(Src+"\\*", faAnyFile, sr) == 0)
     {
       do
         {
           if (sr.Attr & faDirectory) // directory
              {
                if (sr.Name!=".")
                if (sr.Name!="..")
                   {
                     AnsiString SubFld = Src+"\\"+sr.Name;
                     if (!DirectoryExists(Dest+"\\"+ sr.Name))
                         CreateDir(Dest+"\\"+ sr.Name);
                     CopyDirectory (SubFld, Dest+"\\"+ sr.Name, d, bar);
                   }
              }
           else // file
              {
                if (sr.Name!=".")
                if (sr.Name!="..")
                   {
                     AnsiString OldName = Src+"\\"+ sr.Name;
                     AnsiString NewName = Dest+"\\"+ sr.Name;
                     CopyFile(OldName.c_str(), NewName.c_str(), TRUE);
                   }
              }
              bar->Position = i*d;
              i++;
          } while (FindNext(sr) == 0);
    FindClose(sr);
  }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  int Size,fCount,folCount;
  int d,i;
  FolderSize("C:\\D\\",Size,fCount,folCount);
  Label1->Caption=Size;
  Label2->Caption=fCount;
  Label3->Caption=folCount;
  //ProgressBar1->Position = 0;
  ProgressBar1->Max = Size;
  d=Size/fCount;
  CopyDirectory ("C:\\D\\","C:\\B\\", d, ProgressBar1);
 
}
//---------------------------------------------------------------------------
Добавлено через 1 минуту
Первая функция считает конечный размер и количество файлов. Вторая копирует файлы из папки D в папку В.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.10.2011, 13:51
Ответы с готовыми решениями:

Визуальное копирование
Зравствуйте! Ребята подскажите по такому вопросу. Можно ли как-нить визуально оформить копирование файла или файлов с индикацией....

Как реализовать визуальное копирование в Visual c++
Прошу помощи!!! Как реализовать визуальное копирование в visual c++ с использованием функции ShFileOpen Есть форма, на ней 2 поля :...

траблы с прогрессбаром
в чём проблема. Есть основная форма с кнопочкой и прогрессбаром. namespace BaseWriter { public partial class Writer : Form ...

16
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 15:07
1. написали юы, что не так ?
2. прогрессбар как должен двигаться ? что его подталкивает ?
0
1 / 1 / 0
Регистрация: 16.09.2011
Сообщений: 17
13.10.2011, 15:45  [ТС]
1. Программа не совсем верно считает размер файла и количество подкаталогов, но даже с учетом этого, по идее, должен двигаться прогрессбар. А он стоит в нулевой позиции и не изменяется. Его должен двигать инкремент в функции CopyDirectory.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 15:55
я же спрашивал, что - толкает прогрессбар ? сам по себе он двигаться не будет, то , что вы повесили на кнопку - повесьте на таймер, который сделайте Enabled=false по уморчанию, а при нажатии на эту кнопку - Enabled=true

Добавлено через 4 минуты
не вижу я здесь инкремента для прогрессбара
C++
1
2
3
4
5
6
7
8
9
10
  int Size,fCount,folCount;
  int d,i;
  FolderSize("C:\\D\\",Size,fCount,folCount);
  Label1->Caption=Size;
  Label2->Caption=fCount;
  Label3->Caption=folCount;
  //ProgressBar1->Position = 0;
  ProgressBar1->Max = Size;
  d=Size/fCount;
  CopyDirectory ("C:\\D\\","C:\\B\\", d, ProgressBar1);
должно быть , например, в OnTimer :
C++
1
ProgressBar1->Position = какое-нибудь-ваше-значение;
а так, как вы написали - с какого чуда он должен двигаться, раскомментируйте при нажатии на кнопку и напишите ProgressBar1->Position = 110; и он двинется, если, конечно, 100 влазит в ваше ProgressBar1->Max = Size;.

положите сюда кусок проекта - будем посмотреть.
1
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
13.10.2011, 15:59
Разберайся!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    FILE *source,*target;
    int size=0,sum=0,r=0;
    char buf[BUFSIZ];
    source = fopen("1.avi","rb");
    target = fopen("2.avi","wb");
    fseek(source,0,SEEK_END);
    size = ftell(source);
    rewind(source);
    while((r = fread(buf,sizeof(char),BUFSIZ,source))>0)
    {
        fwrite(buf,sizeof(char),r,target);
        sum+=r;
        printf("%3.3f%%\n",((double)sum/(double)size)*100.0);
    }
    fclose(target);
    fclose(source);
    return 0;
}
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.10.2011, 16:10
Цитата Сообщение от mcbor Посмотреть сообщение
1. Программа не совсем верно считает размер файла и количество подкаталогов, но даже с учетом этого, по идее, должен двигаться прогрессбар. А он стоит в нулевой позиции и не изменяется. Его должен двигать инкремент в функции CopyDirectory.
Программа всё верно считает, если при обращении к функции FolderSize инициализировать переменные нулевым значением. Мой BCB5.0 нормально скомпилировал (в основном) Ваш текст и прогресс-бар шевелится, но не так, как нужно. Детально разбираться у меня нет времени, а рабочий проект я прикрепляю... .
Вложения
Тип файла: zip PROJECT.ZIP (224.8 Кб, 53 просмотров)
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 17:32
nick42, на картинке - все "шевеление" п/бара - так и должно быть ?
и папок там - не 224, а 209, включая ДА, файлы я не пересчитывал
Миниатюры
Визуальное копирование с прогрессбаром  
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.10.2011, 17:59
Цитата Сообщение от LK Посмотреть сообщение
nick42, на картинке - все "шевеление" п/бара - так и должно быть ?
и папок там - не 224, а 209, включая ДА, файлы я не пересчитывал
Ежели папок за две сотни, то десяток - другой вложенных могли и не углядеть. А файлы Я пересчитывал (с помощью ТоталКоммандера "Убрать обложки") - всё сошлось!
А прогресс-бар сравнительно медленно движется, если папки-копии ещё нет на диске. А если есть - то просто промелькивает (но на "моей" папке почти до конца). Непонятно только, почему потом опять к началу возвращается. Там переменную i нельзя инициировать внутри CopyDirectory, потому как она сама себя вызывает внутри (я так думаю...).
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 18:07
не движется - двинулся на одно деление и программа записла до окончания процесса , видимо, "движок" сломался
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.10.2011, 18:09
Цитата Сообщение от LK Посмотреть сообщение
не движется - двинулся на одно деление и программа записла до окончания процесса , видимо, "движок" сломался
- работайте Билдером 5-й версии!

P.S. У меня на диске NTFS папка DA содержала 3 каталога и 264 файла общим размером около 970 кб.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 18:23
двинулся и завис - в общем-то, это понятно и естественно
ну и какие-то мелкие у вас файлы... суть не в том, я специально кинул папку побольше, чтобы сравнить прогресс с прогрессом в том Тотал Командире , не получилось, мне кажется, там ProcessMessage прикрутить бы .
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
13.10.2011, 18:28
Да, я щас папку mysql для этих целей использовал (там за 70 МБ), так бар этот слегка подёргался у начала - и застыл. Мне пока непонятно, что конечное значение индекса i (счетчик папок и файлов) очень малое, - 15 в случае с mysql и 14 на прежней папке. Оттого и "прогресса" никакого. Где-то эта i обнуляется не по делу... .
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 18:32
к чему я и веду... при нажатии на кнопку он получает значение , доступное при нажатии , дальше инициализации нет - нет и прогресса, потому я и говорил про таймер , а то что он там в каком то цикле ...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
13.10.2011, 19:46
Лучший ответ Сообщение было отмечено как решение

Решение

если я прально понял тему то:
вот поковыряйте, ток комментовтам нигде не писал - так что спрашивайте
нет проверки - существует ли уже файл
и нет кнопки принудительной отсановки копирования
вверху есть директива #define KBS 102400 это сколько копировать байт за 1 раз
Миниатюры
Визуальное копирование с прогрессбаром  
Вложения
Тип файла: zip copy_dir.zip (1.00 Мб, 89 просмотров)
4
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
13.10.2011, 20:06
и хорошо бы смотрелись два диалога Select Folder.
0
1 / 1 / 0
Регистрация: 16.09.2011
Сообщений: 17
02.11.2011, 13:07  [ТС]
Надо было давно задать вопрос, но может еще кто ответит. Почему именно 102400 можно копировать байт за 1 раз? Откуда взялось это число?Чем ограничено?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
02.11.2011, 16:25
просто так, от балды + метод тыка (т.е. так копирует с такой же скоростью как и другие FileManeger`ы как и стандартный проводник)

например если поставить по 1 байт копировать, то будет ооооочень долго, а так норм
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2011, 16:25
Помогаю со студенческими работами здесь

Проблемы с прогрессбаром
В проге должен пробежать прогресбар и после этого открыться новая форма а текущая должна закрыться. Проблема в том что новая форма...

Пошаговая регистрация с прогрессбаром
Здравствуйте! Решил сделать регистрацию в несколько шагов. Суть какая:&quot; &quot;1 Окно&quot; = Три кнопки: &quot;Кнопка 1&quot;,...

Как построить таблицу с прогрессбаром
Привет. Как построить похожую таблицу со скролами и возможностью поставить в одну из колонок уникальный прогрессбар? Пример таблицы тут:

Input submit с анимацией и прогрессбаром
Привет, подскажите, есть стилизация кнопок Отправки формы, с прогрессбаром. ...

Общие принципы работы с прогрессбаром
Ребята здравствуйте! подскожите пожалуйсто каким методом, (кроме конечно тыка) можно регулировать скорость и узнавать сколько прибавить или...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru