Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3

Визуальное копирование

30.07.2011, 23:36. Показов 2705. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зравствуйте!

Ребята подскажите по такому вопросу.

Можно ли как-нить визуально оформить копирование файла или файлов с индикацией. Компонеты для этих целей я знаю какие можно использовать, а вот сам принцип мне не понятен.

Заранее благодарен кто отозвётся
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2011, 23:36
Ответы с готовыми решениями:

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

визуальное приложение на С++
Используя среду разработки Embarcadero® C++Builder 10.3 (Community Edition) создать визуальное приложение, позволяющее на компоненте...

визуальное программирование
Трассировка, разбиение и размещение графов в визуальном

18
8 / 8 / 0
Регистрация: 10.03.2011
Сообщений: 62
30.07.2011, 23:48
Если копировать винапишными функциями, то одна из функций умеет сообщать прогресс копирования. Название точное не помню, но в мсдн находится элементарно.
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 00:14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const bool SHCopyFile(HWND ParentWindow, const AnsiString &SourceFile, const AnsiString &DestFile, 
                   const bool &Overwrite, const bool &ShowProgress) { 
    SHFILEOPSTRUCT SHFOStruct; 
    SHFOStruct.hwnd = ParentWindow; 
    SHFOStruct.wFunc = FO_COPY; 
    SHFOStruct.pFrom = SourceFile.c_str(); 
    SHFOStruct.pTo = DestFile.c_str(); 
    SHFOStruct.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI; 
    if(!Overwrite) 
         SHFOStruct.fFlags = SHFOStruct.fFlags | FOF_RENAMEONCOLLISION; 
    if(!ShowProgress) 
         SHFOStruct.fFlags |= FOF_SILENT;
 
    return !SHFileOperation(&SHFOStruct); 
}
2
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
31.07.2011, 10:22
Давно давно, я дела через
C++
1
2
3
4
FILE *f;
f = fopen("filename","rb");
...
fclose(f);
И прогресс бар прикручивал!! играя с буфером, добивался скорости копирования быстрее чем стандартная функция копирования Windows!! ну а прогресс бак тогда вообще не составляет труда прикрутить, так как известно размер файла и размер буфера!!
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.07.2011, 11:41  [ТС]
Цитата Сообщение от Maluda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const bool SHCopyFile(HWND ParentWindow, const AnsiString &SourceFile, const AnsiString &DestFile, 
                   const bool &Overwrite, const bool &ShowProgress) { 
    SHFILEOPSTRUCT SHFOStruct; 
    SHFOStruct.hwnd = ParentWindow; 
    SHFOStruct.wFunc = FO_COPY; 
    SHFOStruct.pFrom = SourceFile.c_str(); 
    SHFOStruct.pTo = DestFile.c_str(); 
    SHFOStruct.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI; 
    if(!Overwrite) 
         SHFOStruct.fFlags = SHFOStruct.fFlags | FOF_RENAMEONCOLLISION; 
    if(!ShowProgress) 
         SHFOStruct.fFlags |= FOF_SILENT;
 
    return !SHFileOperation(&SHFOStruct); 
}
Не совсем понятно как эту функцию можна вызвать?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 13:33
Лучший ответ Сообщение было отмечено как решение

Решение

Для Билдера с поддержкой Юникода, внёс поправки

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
#include <ShellApi.hpp>
 
const bool SHCopyFileA(HWND ParentWindow, const AnsiString &SourceFile,
    const AnsiString &DestFile, const bool &Overwrite, const bool &ShowProgress)
{
    SHFILEOPSTRUCTA SHFOStruct;
    SHFOStruct.hwnd = ParentWindow;
    SHFOStruct.wFunc = FO_COPY;
    SHFOStruct.pFrom = SourceFile.c_str();
    SHFOStruct.pTo = DestFile.c_str();
    SHFOStruct.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI;
    if (!Overwrite)
        SHFOStruct.fFlags = SHFOStruct.fFlags | FOF_RENAMEONCOLLISION;
    if (!ShowProgress)
        SHFOStruct.fFlags |= FOF_SILENT;
 
    return !SHFileOperationA(&SHFOStruct);
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::btn1Click(TObject *Sender) {
    if (SHCopyFileA(NULL, "e:\\Фильмы\\Shaolin.2011.P.HDRip.ELEKTRI4KA.LHS.avi",
        "e:\\Фильмы\\Shaolin copy.avi", true, true)) {
        ShowMessage("Файл успешно скопирован!");
    }
    else {
        ShowMessage(SysErrorMessage(GetLastError()));
    }
 
}
//---------------------------------------------------------------------------
3
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.07.2011, 13:40  [ТС]
А группу файлов можно скопировать?
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 13:53
Конечно, можно, только для начала надо получить список файлов

Добавлено через 1 минуту
http://docwiki.embarcadero.com... y.GetFiles
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.07.2011, 14:20  [ТС]
В 6 билдере вылетает такая ошибка

Build
[Linker Error] Unresolved external 'TForm1::SHCopyFileA(void *, const System::AnsiString&, const System::AnsiString&, const bool&, const bool&)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\UNIT1.O BJ

Добавлено через 1 минуту
Тем более я думаю легче сделать через CopyFile(), только я не знаю как туда прикрутить ProgressBar
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 14:49
Ну, дружище, надо понимать, что тебе линкер говорит!

Он тебе говорит следующее, что ты объявил прототип функции, но нет тела функции!
А может тело и есть, но его название не соответствует прототипу.
Возможно ты букву А в конце названия в теле не добавил или в параметрах где-то ошибся,
проверь хорошо

Добавлено через 1 минуту
А всё, я понял в чём у тебя ошибка,
ты вписал эту функцию в определение класса,
а в самой функции не добавил название класса

// добавь в CPP название класса
const bool TForm1::SHCopyFileA(HWND ParentWindow, const AnsiString &SourceFile,
const AnsiString &DestFile, const bool &Overwrite, const bool &ShowProgress) {
}
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
31.07.2011, 15:45  [ТС]
Спасибо большое.
Да действительно дело было в этом в имени класса.

Но это не совсем, то что я хотел здесь стандартное окно Windowsa копирование, а я хотел своё через ProgressBar.

Вот нашёл статейку

http://www.jackyfox.com/2010/1... ogressbar/



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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <ShellApi.hpp>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
DWORD CALLBACK ProgressRoutine(LARGE_INTEGER TotalFileSize,LARGE_INTEGER TotalBytesTransferred,LARGE_INTEGER StreamSize,LARGE_INTEGER StreamBytesTransferred,DWORD dwStreamNumber,DWORD dwCallbackReason,HANDLE hSourceFile,HANDLE hDestinationFile,LPVOID lpData)
{
  // изменяем тукущую позицию
    Form1->ProgressBar1->Position =Form1->ProgressBar1->Max * TotalBytesTransferred.QuadPart / TotalFileSize.QuadPart;
    return PROGRESS_CONTINUE;
 
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const char * FileFrom = ("G:\\armin_van_buuren_feat_sophie_ellis-bextor_-_not_giving_up_on_love_[2010]_e001.avi").c_str();
const char * FileTo   = ("D:\\").c_str();
 
// включаем обработку сообщений для того, чтобы видеть изменения прогрессбара
Application->ProcessMessages();
 
// копируем с флагом защиты от перезаписи
bool copied = CopyFileEx(FileFrom, FileTo, ProgressRoutine, NULL, 0, COPY_FILE_FAIL_IF_EXISTS);
 
// по значению переменной copied можно судить об успехе операции
if (copied == true)
   {
    ShowMessage("Всё отменно скопировалось");
   }
}
//---------------------------------------------------------------------------
делаю по ней но там вылетают 2 ошибки вот в этих строках

C++
1
2
const char * FileFrom = ("G:\\armin_van_buuren_feat_sophie_ellis-bextor_-_not_giving_up_on_love_[2010]_e001.avi").c_str();
const char * FileTo   = ("D:\\").c_str();
а ошибки такие

Build
[C++ Error] Unit1.cpp(29): E2294 Structure required on left side of . or .*
[C++ Error] Unit1.cpp(30): E2294 Structure required on left side of . or .*
1
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.07.2011, 18:41
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Sasha Посмотреть сообщение
const char * FileFrom = ("G:\\armin_van_buuren_feat_sophie_el lis-bextor_-_not_giving_up_on_love_[2010]_e001.avi").c_str(); const char * FileTo = ("D:\\").c_str();
C++
1
2
const char * FileFrom = "G:\\armin_van_buuren_feat_sophie_ellis-bextor_-_not_giving_up_on_love_[2010]_e001.avi";
const char * FileTo   = "D:\\"  /* ТОЛЬКО ЕСЛИ НЕ ОШИБАЮСЬ ЗДЕСЬ НАДО УКАЗАТЬ КОНЕЧНОЕ ИМЯ ФАЙЛА  */;
2
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.08.2011, 12:47  [ТС]
А копирует ли эта функция по сети

Потому как этот код

C++
1
2
const char *FileFrom = "\\S109\\Install\\Firefox Setup 3.6.13.exe";
const char *FileTo   = "C:\\Firefox Setup 3.6.13.exe";
Пишет "Системе не удаётся найти указанный путь"

и выводит он это сообщение через вот это

C++
1
ShowMessage(SysErrorMessage(GetLastError()));
Можно ли как-нить узнать не найден сетевой путь куда копируеться или не найден сете вой путь откуда берёться то что нужно копировать?

Заранее благодарен
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
01.08.2011, 13:59
Цитата Сообщение от Sasha Посмотреть сообщение
"\\S109\\Install\\Firefox Setup 3.6.13.exe";
Во-первых - это не сетевой путь!

Вот пример сетевого пути:

C++
1
"\\\\S109\\Install\\Firefox Setup 3.6.13.exe";
Где,
C++
1
\\\\S109\\
путь к хосту,
а
C++
1
Install\\
расшара

То есть сетевой путь всегда начинается с \\

Добавлено через 2 минуты
Цитата Сообщение от Sasha Посмотреть сообщение
Можно ли как-нить узнать не найден сетевой путь куда копируеться или не найден сете вой путь откуда берёться то что нужно копировать?
Это всё можно узнать с помощью стандартных VCL функций FileExists и DirectoryExists,
они работают и по сетке тоже.
1
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.08.2011, 14:05  [ТС]
Спасибо, блин я и забыл совсем

Ну а поповоду этого можешь что-то сказать?
Цитата Сообщение от Sasha Посмотреть сообщение
Можно ли как-нить узнать не найден сетевой путь куда копируеться или не найден сете вой путь откуда берёться то что нужно копировать?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.08.2011, 17:16  [ТС]
Опять не понятный глюк вылетает

Вот код
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
void __fastcall TProgress::Button1Click(TObject *Sender)
{
  TStringList * b = new TStringList();
  b->Clear();
  AnsiString Path = "\\\\Serv2\\Data\\*.bin";
  TSearchRec sr;
  int iAttributes = faAnyFile;
  int done = FindFirst( Path, iAttributes, sr );
  while(!done)
 {
  b->Add(sr.Name);
  done = FindNext(sr);
 }
  FindClose(sr);
  const char *FileFrom = NULL;
  const char *FileTo   = NULL;
  for(int i = 0; i < b->Count; i++)
 {
  FileFrom = strcat(AnsiString("\\\\Serv2\\Data\\").c_str(),  b->Strings[i].c_str());
  FileTo   = strcat(AnsiString("C:\\DATA\\").c_str(),b->Strings[i].c_str());
 
  bool copied = CopyFileEx(FileFrom, FileTo, ProgressRoutine, NULL, 0, 0/*COPY_FILE_FAIL_IF_EXISTS*/);
 
if (copied == true)
   {
    //ShowMessage("Âñ¸ îòìåííî ñêîïèðîâàëîñü");
    Progress->CGauge1->Progress=0;
   }
else
   {
     ShowMessage(SysErrorMessage(GetLastError()));
   }
   }
   delete b;
   b = NULL;
}
//---------------------------------------------------------------------------
Вот ошибка(см.скриншот)

И выделяется вот эта строка
C++
1
FileTo   = strcat(AnsiString("C:\\DATA\\").c_str(),b->Strings[i].c_str());
Я думаю не правильно сделана конкатенация строки
Миниатюры
Визуальное копирование  
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
01.08.2011, 19:55
Один из минусов современных средств разработки - это то, что некоторые проблемы(которые нужно решать) пишутся методами языка С, где приходится с char* работать! вот тут у многих и возникает проколы, так как нужно совместить и сложение строк и еще многое другое

Sasha, Привести маленький пример копирования через FILE*?(так сказать средствами C/C++
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
01.08.2011, 21:20  [ТС]
Цитата Сообщение от pomkalk Посмотреть сообщение
Один из минусов современных средств разработки - это то, что некоторые проблемы(которые нужно решать) пишутся методами языка С, где приходится с char* работать! вот тут у многих и возникает проколы, так как нужно совместить и сложение строк и еще многое другое

Sasha, Привести маленький пример копирования через FILE*?(так сказать средствами C/C++
Меня интерисует мой вариант
0
 Аватар для Maluda
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
01.08.2011, 22:10
Sasha, я тебе уже давным давно указывал, что у тебя слабая теория по строкам, ну и соответственно по с++. Давай читай литературу.

Цитата Сообщение от Sasha Посмотреть сообщение
C++
1
2
FileFrom = strcat(AnsiString("\\\\Serv2\\Data\\").c_str(), b->Strings[i].c_str());
 FileTo = strcat(AnsiString("C:\\DATA\\").c_str(),b->Strings[i].c_str());
Если ты используешь класс AnsiString, то вполне логично воспользоваться оператором сложения этого класса.

C++
1
2
const AnsiString sFileName = Path + b->Strings[i];
FileFrom = sFileName.c_str();
Добавлено через 3 минуты
Если ты используешь char * strcat ( char * destination, const char * source );
то во-первых ты должен побеспокоится о том, чтобы размер пути твоего файла не превысил буфер, а во-вторых ты этот буфер должен для начала создать, так как FileFrom - это константа, которую можно только единоразово инициализировать, а затем её уже изменять нельзя.

Добавлено через 5 минут
C++
1
2
3
4
char chBuff[MAX_PATH];
strcpy(chBuff,Path.c_str());
strcat(chBuff,b->Strings[i].c_str());
FileFrom = chBuff;
Добавлено через 1 минуту
П.С.В твоём случае настоятельно рекомендую сложение в AnsiString, чтобы не переживать
за выход за границы массива.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2011, 22:10
Помогаю со студенческими работами здесь

визуальное программирование на С++
1.дан текстовый файл формата: n1 x1 y1 x2 y2 где n=0,если (x1,y1-x2,y2)координаты отрезка n=1,если (x1,y1-x2,y2)координаты...

ВИзуальное наследование форм.
Есть проект, содержит около 200 форм. Надо унаследоваться от одной из них. Желательно визуально. Раньше на С++ не кодил, писал немного на...

Поток данных визуальное представление
Всем доброго времени суток. Когда открываем поток допустим на копирование файла, это же поток нулей и единиц(если не ошибаюсь), так вот...

Визуальное программирование. Одномерный массив.
Есть задание. Как делать его для выполнения в командной строке более-менее понятно. А вот с визуальным есть проблемы.Сам студент, учусь...

Визуальное оформление в Builder c++ 2010
Создал форму с красивым, родным Радовским оформлением, закругленные боксы, прозрачные, глиссовские кнопки, свои цвета оформления. Причем...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru