![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Мастерам [D5, NT4]
Dennn_is © (2002-05-21 16:40:00)Делаю архивацию в проге:
ShellExecute(Handle,nil,PChar(ExtractFilePath(application.ExeName)+"arj.exe"),PChar("a rrrrr Data\Izm_12.mdb"),nil,SW_SHOWNORMAL);
Вызывается архиватор ARJ и какое-то время архивирует БД (зависит от размера БД), после чего НУЖНО скопировать созданный архив в другую папку. Проблема в том, что я никак не могу отследить момент окончания архивации. Кто нибудь может помочь, как мне это реализовать? Спасибо.
erik (2002-05-22 18:06:00) [1]Я сделал еже готовую систему для архивации в заданое время. Причем может работать в виде сервиса, формат запуска по времени задается в виде Cron, используется Zip.dll Скорость очень приличная(перебрал 10 архиваторов). Работает с файлами больше 2Gb
Song (2002-05-22 12:56:00) [2]<Switches>
c: skip time-stamp Check
r: Recurse subdirectories
e: Exclude paths from names
Dennn_is (2002-05-22 12:47:00) [3]Уважаемы Song, не подскажите какой? Отдельное огромное спасибо Вам за советы
Song (2002-05-22 12:40:00) [4]У arj.exe есть соответсвющий ключ.
Dennn_is (2002-05-22 12:22:00) [5]Огромное спасибо всем ответившим! Вроде работает, еще маненький вопросик: архиватор делает архив с вложенными папками, например:
путь где должен лежать архив: "D:Papka1\Papka2\Papka3\Arhiv" и архиватор создаст архив с такой же структурой, т.е. в нем будет:
Papka1\Papka2\файл, который заархивировали.
Можно как-нить избежать вложения в архив этих папок? чтобы в архиве был только архивируемый файл, без папок?
Song (2002-05-22 11:47:00) [6]забыл у PChar вторую скобку закрыть
Dennn_is (2002-05-22 11:42:00) [7]Я сделал так:
cmdline:=ExtractFilePath(application.ExeName)+"arj.exe";
if not CreateProcess(PChar(cmdline),
PChar("a arhiv Data\Izm_12.mdb",
nil,
nil,
False,
0,
nil,
nil,
si,
pi )
И нифига, архиватор ругается на "arhiv" - invalid parameter, хотя из командной строки пишу тоже самое - все ОК.
AFROLOV (2002-05-22 11:37:00) [8]cmdline:="c:\arj a ....."- строка на архивацию, и этого достаточно.
Song (2002-05-22 11:10:00) [9]Заполняй параметры CreateProcess()
Dennn_is (2002-05-22 11:06:00) [10]Нашел в FAQ такой пример использования WaitForSingleObject:
procedure TForm1.Button1Click(Sender: TObject);
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
cmdline:string;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:="c:\command.com";
if not CreateProcess( nil, // No module name (use command line).
PChar(cmdline), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent"s environment block.
nil, // Use parent"s starting directory.
si, // Pointer to STARTUPINFO structure.
pi ) // Pointer to PROCESS_INFORMATION structure.
then
begin
ShowMessage( "CreateProcess failed." );
Exit;
end;
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
ShowMessage("Done !");
end;
А как теперь подцепить к этому процессу мою архивацию? подскажите пожалуйста!
Song (2002-05-22 10:28:00) [11]Для DOS приложений я эту проблему решал так: в цикл TShellExecuteInfo где крутится GetProcessExitCode я ставил проверку на FindWindow() на тот момент когда Caption будет такой: ".... (Сеанс завершен)"
AFROLOV (2002-05-22 10:22:00) [12]to
> arbiter © (22.05.02 07:13)
> бывает такая ещё засада с настройками сессии dos....
Arj надо брать под Win32 тогда этой проблемы не будет. Я это делал правда на VB.
Art1 (2002-05-22 10:10:00) [13]А не проще ли сделать архивацию и копирование в батничке, а потом его вызывать? Bat-файл при необходимость легко правится программно, т.е. подредактировал батник и запустил его. Я так делал и у меня все работало на УРА.
arbiter (2002-05-22 07:13:00) [14]бывает такая ещё засада с настройками сессии dos.
WaitForSingleObject в этом случае просигнализирует только в том случае когда завершена сессия dos, а не собственно программа.
То есть arj отработает и завершится, но WaitForSingleObject просигнализирует только тогда когда будет закрыто окно сессии. Что не одно и то же.
Владимир Васильев (2002-05-21 20:20:00) [15]Есть очень полезный пакет JCL : http://www.delphi-jedi.org/Jedi:CODELIBJCL:51032
CommandLine:=GetName("Codec\DivX501Bundle.exe");
if not ShellExecAndWait(CommandLine,Param,"OPEN",SW_SHOW )
then ShowMessage("Not installed");
Song (2002-05-21 17:31:00) [16]Используйте WaitForSingleObject() либо TShellExecuteInfo
AFROLOV (2002-05-21 17:27:00) [17]Смотри в FAQ на этом сайте - дождаться завершения другого приложения(в твоем случае arj)
или на http://www.sources.ru/delphi/system/winexecandwait.shtml