Операции с файлами непопорядку.
От: 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: Операции с файлами непопорядку.
От: 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[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
Как избавиться от этого?
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 не указан, он наследуется от родительского процесса.

Единственный смысл в копировании окружения я вижу в том, чтобы его изменить для порождаемого процесса.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.