Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];




Вниз

Мастерам 


Dennn_is   (2002-05-21 16:40) [0]

Делаю архивацию в проге:

ShellExecute(Handle,nil,PChar(ExtractFilePath(application.ExeName)+"arj.exe"),PChar("a rrrrr Data\Izm_12.mdb"),nil,SW_SHOWNORMAL);

Вызывается архиватор ARJ и какое-то время архивирует БД (зависит от размера БД), после чего НУЖНО скопировать созданный архив в другую папку. Проблема в том, что я никак не могу отследить момент окончания архивации. Кто нибудь может помочь, как мне это реализовать? Спасибо.



AFROLOV   (2002-05-21 17:27) [1]

Смотри в FAQ на этом сайте - дождаться завершения другого приложения(в твоем случае arj)
или на http://www.sources.ru/delphi/system/winexecandwait.shtml



Song   (2002-05-21 17:31) [2]

Используйте WaitForSingleObject() либо TShellExecuteInfo



Владимир Васильев   (2002-05-21 20:20) [3]

Есть очень полезный пакет 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");



arbiter   (2002-05-22 07:13) [4]

бывает такая ещё засада с настройками сессии dos.
WaitForSingleObject в этом случае просигнализирует только в том случае когда завершена сессия dos, а не собственно программа.
То есть arj отработает и завершится, но WaitForSingleObject просигнализирует только тогда когда будет закрыто окно сессии. Что не одно и то же.



Art1   (2002-05-22 10:10) [5]

А не проще ли сделать архивацию и копирование в батничке, а потом его вызывать? Bat-файл при необходимость легко правится программно, т.е. подредактировал батник и запустил его. Я так делал и у меня все работало на УРА.



AFROLOV   (2002-05-22 10:22) [6]

to
> arbiter © (22.05.02 07:13)
> бывает такая ещё засада с настройками сессии dos....


Arj надо брать под Win32 тогда этой проблемы не будет. Я это делал правда на VB.



Song   (2002-05-22 10:28) [7]

Для DOS приложений я эту проблему решал так: в цикл TShellExecuteInfo где крутится GetProcessExitCode я ставил проверку на FindWindow() на тот момент когда Caption будет такой: ".... (Сеанс завершен)"



Dennn_is   (2002-05-22 11:06) [8]

Нашел в 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 11:10) [9]

Заполняй параметры CreateProcess()



AFROLOV   (2002-05-22 11:37) [10]

cmdline:="c:\arj a ....."- строка на архивацию, и этого достаточно.



Dennn_is   (2002-05-22 11:42) [11]

Я сделал так:


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, хотя из командной строки пишу тоже самое - все ОК.



Song   (2002-05-22 11:47) [12]

забыл у PChar вторую скобку закрыть



Dennn_is   (2002-05-22 12:22) [13]

Огромное спасибо всем ответившим! Вроде работает, еще маненький вопросик: архиватор делает архив с вложенными папками, например:
путь где должен лежать архив: "D:Papka1\Papka2\Papka3\Arhiv" и архиватор создаст архив с такой же структурой, т.е. в нем будет:
Papka1\Papka2\файл, который заархивировали.

Можно как-нить избежать вложения в архив этих папок? чтобы в архиве был только архивируемый файл, без папок?



Song   (2002-05-22 12:40) [14]

У arj.exe есть соответсвющий ключ.



Dennn_is   (2002-05-22 12:47) [15]

Уважаемы Song, не подскажите какой? Отдельное огромное спасибо Вам за советы



Song   (2002-05-22 12:56) [16]

<Switches>
c: skip time-stamp Check
r: Recurse subdirectories
e: Exclude paths from names



erik   (2002-05-22 18:06) [17]

Я сделал еже готовую систему для архивации в заданое время. Причем может работать в виде сервиса, формат запуска по времени задается в виде Cron, используется Zip.dll Скорость очень приличная(перебрал 10 архиваторов). Работает с файлами больше 2Gb




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.06.03;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.75 MB
Время: 0.04 c
8-7136            UnDISCOvery           2002-01-05 14:02  2002.06.03  
Графика и База Данных. Как совместить ?


3-6915            VAleksey              2002-05-13 15:30  2002.06.03  
Изменение пути в алиасе


1-7099            XMbIPb                2002-05-22 12:18  2002.06.03  
StringGrid, ComboBox и склероз


7-7237            dobriy                2002-03-09 18:54  2002.06.03  
Помогите с ListView


3-6927            kalinka               2002-05-07 17:00  2002.06.03  
Работа с Blob