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

 
Вызов процедур WinAPI, Анимированое копирование файлов
Ищющий
  Отправлено: 09.10.2003, 17:58


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







Если кто работал с ПРОВОДНИКОМ то должны были наблюдать процесс копирования(перемещения, удаления) файлов визуально в отдельном окошке с прогрессбаром и сопровождающей его анимированной картинкой. Вопрос такой:
Можно ли в BCB вызвать эту процедуру из WinAPI для своего приложения и, если такое возможно, то КАК? Как хоть она называется, если она вообще есть?
Admin
Отправлено: 10.10.2003, 11:10


Владимир

Группа: Администратор
Сообщений: 1190



CopyFileEx
CopyProgressRoutine

Это для Windows NT

---

Далее, в библиотеке RXLib есть функция CopyFile. с подключением
в качестве индикатора копирования TGauge или TProgressBar
CODE

#include <FileUtil.hpp>
procedure CopyFile(const FileName, DestName: string; ProgressControl: TControl);
(См. к ней Help)

---

Для отображения процесса копирования есть компонент TAnimate

---

А вообще для копирования файлов с и отображением стандартного системного диалога копирования файлов используется функция
SHFileOperation (и удаления, и перемещения и переименования
файлов)
FO_DELETE, FO_MOVE, FO_RENAME

FO_COPY  — копировать файл
FO_DELETE  — удалить
FO_MOVE  — переместить
FO_RENAME — переименовать

Управляющие флаги.

FOF_ALLOWUNDO — Если возможно, сохраняет информацию для
возможности Undo.
FOF_CONFIRMMOUSE — Не реализовано.
FOF_FILESONLY — Если в поле pFrom установлено *.*, то операция будет
производиться только с файлами.
FOF_MULTIDESTFILES — Указывает, что для каждого исходного файла в
поле pFrom указана своя директория — адресат.
FOF_NOCONFIRMATION — Отвечает "yes to all" на все запросы в ходе
опеации.
FOF_NOCONFIRMMKDIR — Не подтверждает создание нового каталога,
если операция требует, чтобы он был создан.
FOF_RENAMEONCOLLISION — В случае, если уже существует файл с
данным именем, создается файл с именем "Copy #N of..."
FOF_SILENT — Не показывать диалог с индикатором прогресса.
FOF_SIMPLEPROGRESS — Показывать диалог с индикатором прогресса, но
не показывать имен файлов.
FOF_WANTMAPPINGHANDLE — Вносит hNameMappings элемент.
Дескриптор должен быть освобожден функцией SHFreeNameMappings

CODE

//---------------------------------------------------------------------------
// копирует файлы 1,2,3,4.zip из папки "c:" в папку "d:\cp"
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSHFileOpStruct Fo;
char *p,Buffer[4096];

ZeroMemory(Buffer, sizeof(Buffer));
p = Buffer;
p = StrECopy(p, "C:\\1.ZIP") + 1;
p = StrECopy(p, "C:\\2.ZIP") + 1;
p = StrECopy(p, "C:\\3.ZIP") + 1;
StrECopy(p, "C:\\4.ZIP");

ZeroMemory(&Fo, sizeof(Fo));
Fo.hwnd = Form1->Handle;
Fo.wFunc = FO_COPY; // copy files
Fo.pFrom = Buffer;
Fo.pTo = "D:\\cp";
Fo.fFlags = FOF_SIMPLEPROGRESS;
if ((SHFileOperation(&Fo)!= 0) || (Fo.fAnyOperationsAborted != false))
ShowMessage("Canceled");
}
//------------------------------------------------------------


Отредактировано Admin — 10/10/2003, 12:13
Ищющий
Отправлено: 10.10.2003, 15:49


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







Большое СПАСИБО за подробный ответ! Теперь мне известно, что я искал именно SHFileOperation ! Знаете ли — плохохо когда не знал, да ещё забыл(эт я про себя smile.gif )!
Кстати! Ваша оперативность по ответам мне нравится! УДАЧИ!
maikl
Отправлено: 11.01.2004, 12:15


Станционный диспетчер

Группа: Участник
Сообщений: 135



Странно вроде ничего в этом коде не поменял почти, а пишет что не удается скопировать файл, не удается провести чтение из файла или диска, а пишу я так :

void __fastcall TForm1::N9Click(TObject *Sender)
{
TSHFileOpStruct Fo;
char *p,Buffer[4096];

ZeroMemory(Buffer, sizeof(Buffer));
p = Buffer;
p = StrECopy(p,"C:\\Курсовик1\BD\*.*");

ZeroMemory(&Fo, sizeof(Fo));
Fo.hwnd = Form1->Handle;
Fo.wFunc = FO_COPY; // copy files
Fo.pFrom = Buffer;
Fo.pTo = "С:\\temp";
Fo.fFlags = FOF_SIMPLEPROGRESS;
if ((SHFileOperation(&Fo)!= 0) || (Fo.fAnyOperationsAborted != false))
ShowMessage(" Ну тогда Отмена ");
}

Я пытаюсь скопировать все файлы из каталога BD, если копировать 1 файл пишет тоже самое. Может я делаю что то не так, но компилятор ошибок не выдает, почему он не может скопировать.
Nick
Отправлено: 11.01.2004, 13:18


Машинист паровоза

Группа: Участник
Сообщений: 247



C:\\Курсовик1\BD\*.* -> C:\\Курсовик1\\BD\\*.*
maikl
Отправлено: 11.01.2004, 16:26


Станционный диспетчер

Группа: Участник
Сообщений: 135



QUOTE (Nick @ 11/01/2004, 22:20)
C:\\Курсовик1\BD\*.* -> C:\\Курсовик1\\BD\\*.*

Да я тут ошибся не то скопировал, сначало так и пробывал

C:\\Курсовик1\\BD\\*.*  — выдал сообщение.

потом попробывал

C:\\Курсовик1\BD\*.*  — нечего не выдал.

Ну а так кроме этого, чисто визуально если посмотреть то все правельно написал.
Admin
Отправлено: 11.01.2004, 18:50


Владимир

Группа: Администратор
Сообщений: 1190



Попробовал, все работает:

CODE

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TSHFileOpStruct Fo;
char *p,Buffer[4096];

ZeroMemory(Buffer, sizeof(Buffer));
p = Buffer;
p = StrECopy(p,"C:\\prim\\*.*");

ZeroMemory(&Fo, sizeof(Fo));
Fo.hwnd = Form1->Handle;
Fo.wFunc = FO_COPY; // copy files
Fo.pFrom = Buffer;
Fo.pTo = "c:\\pp";
Fo.fFlags = FOF_SIMPLEPROGRESS;
if ((SHFileOperation(&Fo)!= 0) || (Fo.fAnyOperationsAborted != false))
ShowMessage(" Ну тогда отмена");

}


У вас в строке Fo.pTo = "С:\\temp"; стоит русская С, может из-за этого.

joynter
Отправлено: 12.01.2004, 02:32


Станционный диспетчер

Группа: Участник
Сообщений: 137



лучше всего использовать функцию
ShFileOperation.
maikl
Отправлено: 12.01.2004, 02:39


Станционный диспетчер

Группа: Участник
Сообщений: 135



Ваш пример работает, в принципе он копирует файлы, но я пытаюсь сделать резервное копирование БД, и эти БД я использую в своей программе при копировании, вот с ними он и выдает ошибку, а во всех остальных примерах вроде как копирует без проблем.
maikl
Отправлено: 12.01.2004, 02:46


Станционный диспетчер

Группа: Участник
Сообщений: 135



QUOTE (joynter @ 12/01/2004, 11:34)
лучше всего использовать функцию
ShFileOperation.

Если можно примерчик посмотреть.
Roman
Отправлено: 12.01.2004, 12:46


Дежурный стрелочник

Группа: Участник
Сообщений: 78



У меня все работае. Вот код из работающей программы:

//Резервное копирование файлов программы
SHFILEOPSTRUCT cop_dir;
ZeroMemory (&cop_dir, sizeof(cop_dir));
String DirIstoch = ExtractFileDir(Application->ExeName) + "\\Baza\\*.*";
DirIstoch.SetLength(DirIstoch.Length() + 1);
DirIstoch[DirIstoch.Length()] = '\0';
DirIstoch.SetLength(DirIstoch.Length() + 1);
DirIstoch[DirIstoch.Length()] = '\0'; //обязательно
String DirPriem = ExtractFileDir(Application->ExeName) + "\\Rez_Baza\\";
DirPriem.SetLength(DirPriem.Length() + NULL + NULL);
cop_dir.hwnd = 0;
cop_dir.wFunc = FO_COPY; //операция
cop_dir.pFrom = DirIstoch.c_str(); //папка источник
cop_dir.pTo = DirPriem.c_str(); //папка приемник
cop_dir.fFlags = FOF_FILESONLY | FOF_SILENT | FOF_MULTIDESTFILES |
FOF_NOCONFIRMATION; //флаг операции
SHFileOperation(&cop_dir);

Для картинки измени флаг операции. smile.gif
maikl
Отправлено: 12.01.2004, 13:44


Станционный диспетчер

Группа: Участник
Сообщений: 135



Спасибо твой код заработал. Только вот с флагами хотелось бы спросить, я для индикатора прогресса использую FOF_SIMPLEPROGRESS но чего то ничего нет, может какие нибудь есть еще флаги кроме описанных выше.
Admin
Отправлено: 12.01.2004, 14:44


Владимир

Группа: Администратор
Сообщений: 1190



Для резервного копирования файлов б/д также
можно использовать простой bat-Файл, и запускать
его хоть самому, хоть из программы, типа:

copy.bat
------------
del c:\backup\*.* /p/s
copy c:\bd\*.* c:\backup\*.*
maikl
Отправлено: 12.01.2004, 15:01


Станционный диспетчер

Группа: Участник
Сообщений: 135



Да конечно идея не плоха, но тут должен быть bat файл, потом никакой анимированности, только лишь что светит это Dos окошко которое будет появляться, думаю встроенный код в Exe файл будет куда удобнее использовать, но это кому как, мне реподаватель полюбому скажет если увидет, что надо было по другому сделать. Но за идею спасибо.
Admin
Отправлено: 12.01.2004, 15:10


Владимир

Группа: Администратор
Сообщений: 1190



Ну так вы можете запускать этот bat-файл из exe программы,
кроме того, даже в случае изменения папок — "откуда — куда"
и т.д. вам не придется перекомпилировать программу,
изменяете код в bat-файле и все
maikl
Отправлено: 12.01.2004, 15:33


Станционный диспетчер

Группа: Участник
Сообщений: 135



Я то это понимаю, для курсовика мне нужно было скопировать из папки откуда была запущена моя программа, на дискету, вот и все резервное копирование, вообще я думал что тут код попроще будет, оказалось что самое простое это создать bat файл.

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