Ir para conteúdo
Fórum Script Brasil
  • 0

Ler arquivo em uso


MaxRS

Pergunta

Olá amigos;

Preciso executar o comando “tracert” no prompt e carregar a saída deste comando para dentro do meu programa em Delphi, mas quero que vá carregando conforme o comando é executado, linha a linha como acontece no prompt.

Estou fazendo assim:

//Executa o tracert e salva a saída no arquivo resultado.txt

winExec(‘cmd /c tracert www.google.com > C:\resultado.txt’, SW_HIDE);

//Carrega o arquivo em um memo

Memo1.Lines.LoadFromFile(‘C:\resultado.txt’);

Isso gera um erro pois o .txt ainda está em uso. Para ler preciso esperar o comando terminar de executar (o tracert pode levar vários segundos) para poder carregar o .txt.

Usando AssignFile para tentar ler o arquivo retorna o erro de I/O 32(mesmo com FileMode em ReadOnly). Com o CreateProcess o problema se repete.

Ou seja, só consigo carregar o arquivo depois que o comando termina, não consigo mostrar o andamento em tempo real para o usuário.

Há alguma maneira de ler um .txt que já está em uso por outro processo ou uma maneira de executar o comando e capturar em tempo real a saída?

Desde já agradeço pela atenção.

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
Há alguma maneira de ler um .txt que já está em uso por outro processo ou uma maneira de executar o comando e capturar em tempo real a saída?

Usando AssignFile para tentar ler o arquivo retorna o erro de I/O 32

No caso de um arquivo em DOS, enquanto um processo estiver usando o arquivo e voce tentar le-lo com um outro processo ocorrerá o erro de I/O 32 ( ou seja erro de input / output )

neste endereço voce encontrará funções usadas para esta finalidade

http://swissdelphicenter.ch/en/showcode.php?id=93

usando de uma delas montei este exemplo para voce

OBS: após a conclusão do comando tracert voce conseguira ler o arquivo gerado jogando o resultado em um memo

function ExecAndWait(const FileName: string; const CmdShow: Integer): Longword;
var { by Pat Ritchey }
  zAppName: array[0..512] of Char;
  zCurDir: array[0..255] of Char;
  WorkDir: string;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  AppIsRunning: DWORD;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, SizeOf(StartupInfo), #0);
  StartupInfo.cb          := SizeOf(StartupInfo);
  StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := CmdShow;
  if not CreateProcess(nil,
    zAppName, // pointer to command line string
    nil, // pointer to process security attributes
    nil, // pointer to thread security attributes
    False, // handle inheritance flag
    CREATE_NEW_CONSOLE or // creation flags
    NORMAL_PRIORITY_CLASS,
    nil, //pointer to new environment block
    nil, // pointer to current directory name
    StartupInfo, // pointer to STARTUPINFO
    ProcessInfo) // pointer to PROCESS_INF
    then Result := WAIT_FAILED
  else
  begin
    while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
      Sleep(50);
    end;
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
  end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
var    Arq : TextFile;
         Linha : string;
begin
   BitBtn1.Enable := false;
   Memo1.Clear;
   //Executa o tracert e salva a saída no arquivo resultado.txt
   ExecAndWait('cmd /c tracert www.google.com > C:\resultado.txt', SW_HIDE);

   //Carrega o arquivo em um memo logo apos a sua conclusão
   AssignFile(Arq, 'C:\resultado.txt');
   Reset(Arq);
   while not EOF(Arq) do
      begin
        ReadLn(Arq, Linha);
        Memo1.Lines.Append(linha);
      end;
   CloseFile(Arq);
   BitBtn1.Enable := true;

end;

clicando no botão, o mesmo será desabilitado, impedindo novo click.... a função executará o comando e o arquivo resultado.txt só será lido após a função ter sido executada, jogando o seu conteudo no memo.... após feito isso o botão será novamente liberado para executar novamente o procedimento.

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...