Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.03;
Скачать: CL | DM;

Вниз

Мастерам   Найти похожие ветки 

 
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



Страницы: 1 вся ветка

Текущий архив: 2002.06.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
14-7216
3d[Power]
2002-04-23 21:54
2002.06.03
игруха.


6-7146
DriveT
2002-03-21 22:06
2002.06.03
Порт сканер помогите плз...


4-7271
Deus
2002-03-29 14:11
2002.06.03
WM_APPCOMMAND


3-6939
vopros
2002-05-14 17:38
2002.06.03
Проблема с Interbase


1-7078
Lobzik
2002-05-22 09:07
2002.06.03
StringGrid