Помогите понять как это побороть...
Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются.
Как сделать, что бы операция удаления происходила только после завершения архивирования. Я смог побороть это по глупому — установил sleep(5000)
for i:=0 to high(a) do
s:=s+' '+a[i];
winexec(Pchar('jar a 00601 '+s),1);
sleep(5000);
for i:=0 to high(a) do
deletefile(a[i]);
Здравствуйте, Vodyamba, Вы писали:
V>Помогите понять как это побороть... V>Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются. V>Как сделать, что бы операция удаления происходила только после завершения архивирования. Я смог побороть это по глупому — установил sleep(5000)
Под рукой нету jar'a, но RAR'е, например, есть опция "Удалить файлы после архивации" (ключ -df)
Здравствуйте, Vodyamba, Вы писали:
V>Помогите понять как это побороть... V>Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются. V>Как сделать, что бы операция удаления происходила только после завершения архивирования.
Вместо WinExec используй CreateProcess совместно с WaitForSingleObject
Здравствуйте, altaravic, Вы писали:
A>Вместо WinExec используй CreateProcess совместно с WaitForSingleObject
Интересно с чем это едят? Ни разу не пользовался...
А подобные проблемы у меня и раньше были...
Когда пишешь Filecreate (или Createfile не помню), а потом сразу пытаешься удалить его, то он ещё не знает, что файл создался...
Есть мысль, что если ставить везде условие то наверное будет всё ОК
Здравствуйте, Vodyamba, Вы писали:
V>Помогите понять как это побороть... V>Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются. V>Как сделать, что бы операция удаления происходила только после завершения архивирования. Я смог побороть это по глупому — установил sleep(5000)
V>
V> for i:=0 to high(a) do
V> s:=s+' '+a[i];
V> winexec(Pchar('jar a 00601 '+s),1);
V> sleep(5000);
V> for i:=0 to high(a) do
V> deletefile(a[i]);
V>
Понаписывали........
The WinExec function runs the specified application.
Note This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.
Вот тебе пример использования. Давно писал, можно и лучше, но тебе подойдет
RunProgram ('jar', 'a 00601 ' + s, '', SW_NORMAL, True);
function RunProgram (FileName : string; CommandLine : string; WorkDir : string; ShowCmd : Integer; WaitFor : Boolean = True) : DWORD;
var
ProcessInfo : TProcessInformation;
StartupInfo : TStartupInfo;
EnviromentBlock : PChar;
ExecString : string;
aWorkDir : PChar;
begin
with StartupInfo do begin
cb := sizeof (StartupInfo);
lpReserved := nil;
lpDesktop := nil; {inherit}
lpTitle := nil;
dwFlags := STARTF_USESHOWWINDOW; {Tis means it should be used wShowWindow}
wShowWindow := ShowCmd;
cbReserved2 := 0;
lpReserved2 := nil;
end;
FileName := Trim (FileName);
if (FileName <> '') and (FileName [1] <> '"') and (Pos (' ', FileName) > 0) then
FileName := '"' + StringReplace (FileName, '"', '""', [rfReplaceAll]) + '"';
if WorkDir = ''then
aWorkDir := nil
else
aWorkDir := PChar (WorkDir);
EnviromentBlock := GetEnvironmentStrings;
try
ExecString := FileName + ' ' + CommandLine;
if not CreateProcess( nil,
PChar(ExecString),
nil,
nil,
false,
NORMAL_PRIORITY_CLASS,
EnviromentBlock,
aWorkDir,
StartupInfo,
ProcessInfo)
then RaiseLastWin32Error;
finally
FreeEnvironmentStrings (EnviromentBlock)
end;
try
if WaitFor then begin
Result := WaitForSingleObject(ProcessInfo.hProcess, 2 * 60 * 60 * 1000 {2 hours});
case Result of
WAIT_TIMEOUT : raise Exception.Create ('Process timed out.');
WAIT_FAILED : raise Exception.Create ('Process filed');
end;
GetExitCodeProcess (ProcessInfo.hProcess, Result);
end else
Result := 0;
finally
CloseHandle (ProcessInfo.hProcess);
CloseHandle (ProcessInfo.hThread);
end;
end;
Здравствуйте, wildwind, Вы писали:
W>BTW а зачем копировать Environment?
Удобства ради. Мой вариант без проблем запустит notepad.exe не имея полного пути к нему. Тоесть CreateProcess будет искать notepad.exe или другую программу используя Environment Variables, к примеру PATH=%SystemRoot%\system32.
Здравствуйте, Danchik, Вы писали:
W>>BTW а зачем копировать Environment? D>Удобства ради. Мой вариант без проблем запустит notepad.exe не имея полного пути к нему. Тоесть CreateProcess будет искать notepad.exe или другую программу используя Environment Variables, к примеру PATH=%SystemRoot%\system32.
CreateProcess в любом случае будет искать программу во всех положенных местах, включая PATH. Если Environment не указан, он наследуется от родительского процесса.
Единственный смысл в копировании окружения я вижу в том, чтобы его изменить для порождаемого процесса.