Operação de IO
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.
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
Curtidas 0
Respostas
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
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
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
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.
Valeu.
GOSTEI 0
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]
:P :P :P :P :P
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
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.
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