Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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



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

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

Наверх





Память: 0.48 MB
Время: 0.006 c
3-6939
vopros
2002-05-14 17:38
2002.06.03
Проблема с Interbase


7-7238
ATLANTIDO
2002-03-04 14:57
2002.06.03
Защита дисков


1-6967
Fast
2002-05-22 09:43
2002.06.03
Зависание


1-7029
Tahion
2002-05-18 19:14
2002.06.03
CoolBar->ToolBar->ToolButton. Как убрать края ToolButton?


1-7046
phantom2040
2002-05-21 11:04
2002.06.03
Загрузка в Memo текстового файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский