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

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

13.10.2011, 13:51. Показов 3105. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru