Operação de IO

Delphi

29/07/2004

Galera é o seguinte estou fazendo uma aplicação que fica verificando um path esperando um arquivo texto para importar para uma Base Oracle...
o tamanho do arquivo é de +- 4MB e ele demora um pouco para copiar... e agora a bronca enquanto o arquivo é copiado e programa tenta abrir o mesmo pois ele já consegue ver o arquivo lá, porém ele ainda não acabou de ser copiado ai dá um erro de IO... como posso saber se o arquivo já acabou de ser copiado???

Obrigado Amigos.


Rodrigobc

Rodrigobc

Curtidas 0

Respostas

Mago M3rl1n

Mago M3rl1n

29/07/2004

Como que você esta abrindo esse arquivo texto ? Voce pode verificar se ele ainda esta aberto, ou tratar com try...except.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/07/2004

aparentemente vc controla essa verificação temporária num Timer. se for isso, quando você encontrar o arquivo, você desliga o timer (Timer.Enabled:=False) e religa (Timer.Enabled:=True) depois que terminar a importação.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

29/07/2004

aparentemente vc controla essa verificação temporária num Timer. se for isso, quando você encontrar o arquivo, você desliga o timer (Timer.Enabled:=False) e religa (Timer.Enabled:=True) depois que terminar a importação.


melhorando um pouco:

aparentemente vc controla essa verificação num Timer. se for isso, quando você encontrar o arquivo, você desliga o timer (Timer.Enabled:=False), faz a importação e religa (Timer.Enabled:=True) depois que terminar essa importação.

algo como:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    // procura o arquivo
    if FileExists( seu_arquivo ) then
    begin
        // desliga o timer
        Timer1.Enabled := False;

        // faz a importação
        {...}

        // religa o timer
        Timer1.Enabled := True;
        end;
end;


GOSTEI 0
Rodrigobc

Rodrigobc

29/07/2004

emerson isso num dá certo não pois o mesmo passa uns 3 minutos para a copia pelo FTP e o programa checou o diretório quando ele estava em um minuto de cópia ai ele tenta abrir o arquivo para ler e gravar na base mais o mesmo ainda não terminou de copiar com isso no meio do processo de leitura dá o erro de IO. o que seria certo é saber se o arquivo já foi copiado se sim eu processo se ainda estiver copiando eu não processo e espero o próximo timer passar !!

Valeu.


GOSTEI 0
Rômulo Barros

Rômulo Barros

29/07/2004

[b:88698d7b36][color=red:88698d7b36]Durante a cópia do arquivo(do servidor ftp para a sua máquina), provavelmente o tamanho(size) do arquivo irá sempre aumentar. Então, faça um loop até que a cópia tenha acabado(quando não houver mais modificão no tamanh do arquivo).[/color:88698d7b36][/b:88698d7b36]

procedure TForm1.Button1Click(Sender: TObject);
Var
  intSize : Integer;
  Arq : TExtFile;
begin
   AssignFile(Arq,´c:\Arquivo.txt´);
   If(FileExists(´c:\Arquivo.txt´))then
   Begin
     Reset(Arq);

     Repeat
        intSize := filesize(Arq);
        Application.ProcessMessages();
     Until(intSize = filesize(Arq));
//     IniciarImportação()
        { ...
         ... }
     End;
end;

end.

:P :P :P :P :P


GOSTEI 0
Beppe

Beppe

29/07/2004

Vc pode fazer uma cópia ´instantânea´. Copie o arquivo com um nome provisório. Logo após, renomeie este arquivo para o nome final.

CopyFile(´a.ext´, ´~b.ext´);
RenameFile(´~b.ext´, ´b.ext´);

Mesmo se arquivo vai num servidor FTP, isto deve funcionar sem problemas, após adaptar a API.


GOSTEI 0
POSTAR