Ищющий |
Отправлено: 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 ! Знаете ли — плохохо когда не знал, да ещё забыл(эт я про себя )!
Кстати! Ваша оперативность по ответам мне нравится! УДАЧИ! |
|
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);
Для картинки измени флаг операции. |
|
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 файл. |
|