Re: Операции с файлами непопорядку.
От: Danchik Украина  
Дата: 25.04.05 14:58
Оценка: 1 (1)
Здравствуйте, 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;
Re[4]: Операции с файлами непопорядку.
От: wildwind Россия  
Дата: 26.04.05 07:47
Оценка: +1
Здравствуйте, Danchik, Вы писали:

W>>BTW а зачем копировать Environment?

D>Удобства ради. Мой вариант без проблем запустит notepad.exe не имея полного пути к нему. Тоесть CreateProcess будет искать notepad.exe или другую программу используя Environment Variables, к примеру PATH=%SystemRoot%\system32.

CreateProcess в любом случае будет искать программу во всех положенных местах, включая PATH. Если Environment не указан, он наследуется от родительского процесса.

Единственный смысл в копировании окружения я вижу в том, чтобы его изменить для порождаемого процесса.
Операции с файлами непопорядку.
От: Vodyamba Россия  
Дата: 25.04.05 04:35
Оценка:
Помогите понять как это побороть...
Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются.
Как сделать, что бы операция удаления происходила только после завершения архивирования. Я смог побороть это по глупому — установил 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]);
Re: Операции с файлами непопорядку.
От: crackoff Россия  
Дата: 25.04.05 04:48
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Помогите понять как это побороть...

V>Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются.
V>Как сделать, что бы операция удаления происходила только после завершения архивирования. Я смог побороть это по глупому — установил sleep(5000)


Под рукой нету jar'a, но RAR'е, например, есть опция "Удалить файлы после архивации" (ключ -df)
Re: Операции с файлами непопорядку.
От: altaravic  
Дата: 25.04.05 06:38
Оценка:
Здравствуйте, Vodyamba, Вы писали:

V>Помогите понять как это побороть...

V>Надо заархивировать файлы, а потом их удалить... но получается, что они не успевают заархивироваться и удаляются.
V>Как сделать, что бы операция удаления происходила только после завершения архивирования.

Вместо WinExec используй CreateProcess совместно с WaitForSingleObject
Re: Операции с файлами непопорядку.
От: rico_spb  
Дата: 25.04.05 09:20
Оценка:
А jar уже списка файлов для архивирования не понимает?

С уважением,
Кирилл Разуваев
Posted via RSDN NNTP Server 1.9
Re[2]: Операции с файлами непопорядку.
От: Vodyamba Россия  
Дата: 25.04.05 10:41
Оценка:
Здравствуйте, altaravic, Вы писали:

A>Вместо WinExec используй CreateProcess совместно с WaitForSingleObject


Интересно с чем это едят? Ни разу не пользовался...

А подобные проблемы у меня и раньше были...
Когда пишешь Filecreate (или Createfile не помню), а потом сразу пытаешься удалить его, то он ещё не знает, что файл создался...

Есть мысль, что если ставить везде условие то наверное будет всё ОК
 if filecreate(...)=true then ... и.д.
Re[2]: Операции с файлами непопорядку.
От: Vodyamba Россия  
Дата: 25.04.05 10:43
Оценка:
Здравствуйте, rico_spb, Вы писали:

_>А jar уже списка файлов для архивирования не понимает?


Я так и делаю
Jar a [имя архива] [список файлов]
Re[2]: Операции с файлами непопорядку.
От: Vodyamba Россия  
Дата: 25.04.05 10:43
Оценка:
Здравствуйте, crackoff, Вы писали:

C>Под рукой нету jar'a, но RAR'е, например, есть опция "Удалить файлы после архивации" (ключ -df)


А это мысль, я что-то и забыл про это...
Re[3]: Операции с файлами непопорядку.
От: Dimonka Верблюд  
Дата: 25.04.05 10:54
Оценка:
A>>Вместо WinExec используй CreateProcess совместно с WaitForSingleObject

V>Интересно с чем это едят? Ни разу не пользовался...


Набери это в гугле и найдётся целая куча решений:

http://www.swissdelphicenter.ch/torry/showcode.php?id=93
Re[2]: Операции с файлами непопорядку.
От: wildwind Россия  
Дата: 25.04.05 16:16
Оценка:
Здравствуйте, Danchik, Вы писали:

D>function RunProgram


Вот еще мой вариант:

function Exec(commandLine: string; workDir: string = ''): cardinal;
var pInfo: TProcessInformation;
    sInfo: TStartupInfo;
    wd: pchar;
begin
  sInfo.cb := sizeof(sInfo);
  fillChar(sInfo, sizeof(sInfo), #0);
  if workDir = '' then wd:= nil
  else wd:= pchar(workDir);
  win32check(createProcess(nil, pchar(commandLine),
    nil, nil, false, 0, nil, wd, sInfo, pInfo));
  waitForSingleObject(pInfo.hProcess, INFINITE);
  getExitCodeProcess(pInfo.hProcess, result);
  closeHandle(pInfo.hProcess);
  closeHandle(pInfo.hThread);
end;


BTW а зачем копировать Environment?
Re[3]: Операции с файлами непопорядку.
От: Danchik Украина  
Дата: 25.04.05 17:29
Оценка:
Здравствуйте, wildwind, Вы писали:

W>BTW а зачем копировать Environment?

Удобства ради. Мой вариант без проблем запустит notepad.exe не имея полного пути к нему. Тоесть CreateProcess будет искать notepad.exe или другую программу используя Environment Variables, к примеру PATH=%SystemRoot%\system32.
Re[2]: Операции с файлами непопорядку.
От: Vodyamba Россия  
Дата: 26.04.05 00:35
Оценка:
Здравствуйте, Danchik, Вы писали:

Функция хорошая... понравилась... выполняет, то, что хотел...

Только ругается на RaiseLastWin32Error говорит, что depricated
Как избавиться от этого?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.