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

Recriar O Arquivo Em Tempo De Execução


RenatoMejias

Pergunta

Meu problema é o seguinte, estou fazendo um programa que acessa um arquivo txt que está em rede, no entanto quando alguém apaga o arquivo txt dá problema em todos os computadores, porque coloquei um timer que a cada segundo puxa as informações do arquivo para um memo.

Estou tentando fazer que o arquivo seja criado no momento em que ele ver que ele foi deletado, no momento sem sucesso, abaixo vai o código fonte que já fiz:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  ScrollMessage:TWMVScroll;
  i:integer;
  FFileHandle: TFileStream;
begin
  if not FileExists(sala) then
    begin
      FileClose(FileCreate(sala));
      FFileHandle := TFileStream.Create(sala, fmOpenWrite or fmShareDenyWrite);
      FFileHandle.Seek(0, soFromEnd);
    end;

  try
    if sala = '' then

    else
      [b]memo1.Lines.LoadFromFile(sala);[/b]
      StatusBar1.Panels[0].Text := TimeToStr(now);
      ScrollMessage.Msg:=WM_VScroll;
  for i := 0 to Memo1.Lines.Count do
  begin

   ScrollMessage.ScrollCode:=sb_LineDown;
   ScrollMessage.Pos:=0;
   Memo1.Dispatch(ScrollMessage);
  end;

  Except
      ShowMessage('Houve algum problema com o arquivo de texto, o programa será fechado!');
      close;
  end;

end;

Ele cria o arquivo sem problemas, no entanto vai dar um erro na linha que deixei em negrito, com o segunte erro:

Project.Projeto.exe raised exception class EFOpenError with message 'Cannot open file "C:\Documents and Settings\All\User\Documentos\sala.txt". O arquivo já está sendo usado por outro processo'. Process stopped. Used Setp or Run to continue.

Alguém tem uma idéia do que possa ser?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

renatomejias, a mensagem diz que o arquivo está sendo usado por outro processo. E acho que é o seu processo (programa):

Ele cria o arquivo sem problemas, no entanto vai dar um erro na linha que deixei em negrito, com o segunte erro:
Talvez aí esteja o problema. você utiliza:

  if not FileExists(sala) then
  begin
    FileClose(FileCreate(sala));
    FFileHandle := TFileStream.Create(sala, fmOpenWrite or fmShareDenyWrite);
    FFileHandle.Seek(0, soFromEnd);
  end;
  try
    if sala = '' then

    else
      [b]memo1.Lines.LoadFromFile(sala);[/b]
    StatusBar1.Panels[0].Text := TimeToStr(now);
    ScrollMessage.Msg:=WM_VScroll;

Observe que se o arquivo não existe, você supostamente cria e o fecha (via FileCreate e FileClose) e em seguida cria-o novamente utilizando TFileStream.Create, estando aberto para escrita e bloqueando a escrita por outros. Em seguida posiciona no fim do arquivo. Para mais adiante tentar executar o LoadFromFile (onde acusa o erro). Talvez a forma como LoadFromFile utiliza para a abertura do arquivo impede que ele já esteja em uso.

Não estou certo do que mais você possa fazer com este arquivo, mas a impressão que tenho é que a parte que envolve o TFileStream não tem finalidade e se você removê-la o arquivo estará criado e fechado, podendo ser aberto e lido por LoadFromFile.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

Já resolvi o problema, faltava fechar a instância, apenas adicionei a seguinte linha no fim do if

FFileHandle.Destroy

ai ele fecha a instância e faz o acesso normalmente.

Obrigado pela ajuda.

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,3k
×
×
  • Criar Novo...