Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Как проверить файл на возможность записи?


Автор: ^D^ima 03.07.19, 06:59
Программа запускает батник, результатом которого является создание файла. Время работы батника разное. Нужно как-то зациклить программу, пока этот файл не создастся и сам файл будет доступен для записи, т.к. создается он изначально пустой а потом наполняется.

Дальше программа файл ренеймом переносит созданный файл в другую папку.

Пробовал так сделать, не получается, не циклится, сразу проходит

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
          ShellExecute(0, 'open', 'cmd.exe', PChar(S), nil, SW_HIDE); // запуск стороннего батника
     
          repeat
            Try
              Succes:=True;
                  RenameFile(OutputFolder+ChangeFileExt(ListBox1.Items[ListBox1.ItemIndex],''),OutputFolder+GetUserFromWindows+OutputFileName);
              Except Succes:=False;
     
            End;
          until succes;


Добавлено
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
          repeat
            Try
                Succes:=True;
                FS:=TFileStream.Create(OutputFolder+ChangeFileExt(ListBox1.Items[ListBox1.ItemIndex],''),fmOpenWrite);
              Except Succes:=False;
            End;
          until succes;
          FS.Free;


Вот так вродебы пашет, я FS.Free в нужном месте поставил, да и конструкцию не переврал?

Автор: Gonarh 03.07.19, 08:10
Извращенец. Дождись отработки батника.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure ExecuteFileAndWait(FileName:String;WindowState:Word);
    var
    Buffer: array[0..511] of Char;
    StartupInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
    ExitCode:DWORD;
    begin
      StrPCopy(Buffer,FileName);
      FillChar(StartupInfo,SizeOf(StartupInfo),#0);
      StartupInfo.cb := Sizeof(StartupInfo);
      StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow:=WindowState;
      if CreateProcess(nil, Buffer, nil, nil, False,
                       CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
                       nil, nil, StartupInfo, ProcessInfo)
      then begin
         while WaitforSingleObject(ProcessInfo.hProcess,500)=WAIT_TIMEOUT do application.ProcessMessages;
         GetExitCodeProcess(ProcessInfo.hProcess, ExitCode);
       end
    end;
    ExecuteFileAndWait(S, SW_HIDE);

Автор: ^D^ima 03.07.19, 08:44
Мудрено, но спасибо :)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)