Array
(
)

Erro Ao tentar ler o Arquivo

Marcal
   - 22 fev 2006

Bom dia pessoal, to tendo o seguinte probleminha uma função para ler um arquivo e depois se quero editar o mesmo arquivo ele da dando o erro: I/O ERROR 32:
A função que uso pra ler o arquivo e não ta com erro é:

AssignFile(ArqServidor, ´C:\ARQUIVO.TXT´);
Reset(ArqServidor);
Read(ArqServidor, LocalServidor);
CloseFile(ArqServidor);

e depois tento usar a seguinte para editar o arquivo e da o erro é:
Try
AssignFile (ArquivoServidor, ´C:\Arquivo.TXT´);
ReWrite(ArqTexto);
WriteLn(ArqTexto, LbLocal.Text);
except
On EconvertError do
Messagedlg(´ERRO: Arquivo Invalido´, mterror, [mbok],0);
end;

Alguem pode me ajudar a resolver este problema


Paullsoftware
   - 22 fev 2006


Citação:
AssignFile(ArqServidor, ´C:\ARQUIVO.TXT´);
Reset(ArqServidor);
Read(ArqServidor, LocalServidor);
CloseFile(ArqServidor);

coloque esse código dentro do Try Finally..

try
AssignFile(ArqServidor, ´C:\ARQUIVO.TXT´);
Reset(ArqServidor);
Read(ArqServidor, LocalServidor);
finally
CloseFile(ArqServidor);
end;


Massuda
   - 22 fev 2006


Citação:
I/O ERROR 32
Esse erro indica que o arquivo está aberto/em uso.

No caso, quando você vai escrever no arquivo, o Rewrite pede acesso exclusivo ao arquivo, mas não está conseguindo porque alguém está usando o arquivo (para leitura ou escrita). Pode ser alguma outra parte do seu programa ou algum outro programa que está mantendo o arquivo aberto.


Marcal
   - 22 fev 2006

Realmente amigo Massuda, e isso mesmo mais a unica rotina que tenho em meu sistema pra abrir este arquivo e este eu tentei fazer como nosso amigo falou colocar o codigo dentro do try finally mais continua dando o mesmo erro tem alguma função que força o fechamento deste arquivo.


Massuda
   - 22 fev 2006


Citação:
...função que força o fechamento deste arquivo.
Quem faz isso é o CloseFile.... no caso do código que escreve no arquivo, você está chamando CloseFile depois de completar a escrita? No código que você postou não tem o CloseFile.


Marcal
   - 22 fev 2006

Sim Amigo inclusive fiz um teste com outro nome de arquivo e da certo mais quanto tento acessar o arquivo q ja fechei closefile() continua o erro
1º {Codigo de Leitura}

Try
AssignFile(ArqServidor, ´C:\SERVIDOR.TXT´);
Reset(ArqServidor);
Read(ArqServidor, LocalServidor);
Finally
CloseFile(ArqServidor);
end;

e depois 2º
{Codigo de Escrita }
Try
Try
AssignFile(ArquivoServidor, ´C:\SERVIDOR.TXT´);
ReWrite(ArquivoServidor);
WriteLn(ArquivoServidor, LbLocal.Text);
Finally
Closefile(ArquivoServidor);
end;
except
On EconvertError do
Messagedlg(´ERRO: Arquivo Invalido´, mterror, [mbok],0);
end;


Massuda
   - 22 fev 2006

Como você testou com outro nome de arquivo e dá certo, é sinal que esse arquivo está em uso por outra parte do seu programa ou por outro programa.

Os pedaços de código que você postou não tem problema.


Martins
   - 22 fev 2006

Testei o código abaixo e funcionou, não deu erro algum, não sei se serve para vc, mas dê uma olhada.


#Código


procedure TForm1.Button1Click(Sender: TObject);
var
Arq: TextFile;
LocalServidor: String;
begin
try
AssignFile(Arq, ´C:\Rename\Teste.txt´);
Reset(Arq);
ReadLn(Arq, LocalServidor);
Edit2.Text := LocalServidor;
finally
CloseFile(Arq);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
arq: TextFile;
begin
try
try
AssignFile(Arq, ´C:\Rename\Teste.txt´);
ReWrite(Arq);
WriteLn(Arq, Edit1.Text);
finally
CloseFile(Arq);
end;
except
on EConvertError do
MessageDlg(´ERRO: Arquivo inválido´, mtError, [mbOK], 0 );
end;
end;


Boa sorte!!!


Martins
   - 22 fev 2006


Citação:
Como você testou com outro nome de arquivo e dá certo, é sinal que esse arquivo está em uso por outra parte do seu programa ou por outro programa.

Os pedaços de código que você postou não tem problema.


Verdade Massuda, pode ser isso, talvez um outo aplicativo possa está usando o arquivo, para simular o erro eu criei o arquivo normal, utilizando o CloseFile para fechá-lo e depois em outro botão eu faço a leitura do conteúdo do arquivo sem fechá-lo e quando tento alterar seu conteúdo, é mostrado o Erro 32 q indica q o arquivo está em uso. Talvez em algum lugar do seu sistema vc faça essa leitura, verifique seu código.

Boa sorte!!!


Marcal
   - 22 fev 2006

Amigo Martins ainda não teste seu codigo mais vou testar. Quanto outra parte do sistema esta utilizando o arquivo e impossivél pq esta e a primeira função q estou criando no meu projeto para ler e editar esse arquivo. a leitura eu coloquei no evento OnActive do meu formulário Principal e quando eu quero alterar o conteudo do meu arquivo eu entro em um outro forumulário no menu Utilitário do meu formulario principal, Será que não e alguma rotina interna do Windows XP que continua com o arquivo aberto internamente.


Massuda
   - 22 fev 2006

Usando o Windows Explorer você consegue mover/excluir esse arquivo? Se não conseguir, é sinal que o arquivo está em uso por algum programa em execução.


Martins
   - 22 fev 2006


Citação:
Usando o Windows Explorer você consegue mover/excluir esse arquivo? Se não conseguir, é sinal que o arquivo está em uso por algum programa em execução.


Isso mesmo, bem lembrado Massuda, faça o teste sugerido pelo Massuda ou então mude o nome desse arquivo chato :P

Faça os testes e post aqui novamente!!


Marcal
   - 22 fev 2006

Sim Amigos antes deu colocar o try finally na leitura ele não aceitava mais agora ele aceita mover alterar e pagar mais continuo usando a função

Try
AssignFile(ArquivoServidor, ´C:\SERVIDOR.TXT´);
ReWrite(ArquivoServidor);
WriteLn(ArquivoServidor, LbLocal.Text);
Finally
Closefile(ArquivoServidor);
end;

para alterar o arquivo e so q agora da erro I/O error 103, o mudou o erro mais continua não funcionando


Massuda
   - 22 fev 2006


Citação:
erro I/O error 103
Esse erro significa que o arquivo não foi aberto. No caso do seu código, isso significa que o Rewrite falhou. Experimente codificar assim...#Código

AssignFile(ArquivoServidor, ´C:\SERVIDOR.TXT´); 
{$I-} ReWrite(ArquivoServidor); {$I+}
if IOResult = 0 then begin
{$I-} WriteLn(ArquivoServidor, LbLocal.Text); {$I+}
{$I-} Closefile(ArquivoServidor); {$I+}
end;
...o {$I-} e {$I+} são coisas antigas, mas funcionam neste caso. O $I neste caso habilita/desabilita o runtime error, mas com isso desabilitado a única forma de você saber se deu erro é checar se o valor de IOResult é diferente de zero (zero indica nenhum erro).


Marcal
   - 22 fev 2006

E realmente amigos eu usei esta forma
AssignFile(ArquivoServidor, ´C:\SERVIDOR.TXT´);
{$I-} ReWrite(ArquivoServidor); {$I+}
if IOResult = 0 then
begin
{$I-} WriteLn(ArquivoServidor, LbLocal.Text); {$I+}
{$I-} Closefile(ArquivoServidor); {$I+}
end
So que o valor de IOResult = Inaccessible value
E não acontence nada nenhuma msg de erro como nosso amigo Massuda falou o que devo fazer agora parece uma coisa tão simples mais ta me dando a maior dor de cabeça tentei colocar <> ao inves de = mais nada


Martins
   - 22 fev 2006


Citação:
Sim Amigos antes deu colocar o try finally na leitura ele não aceitava mais agora ele aceita mover alterar e pagar mais continuo usando a função

Try
AssignFile(ArquivoServidor, ´C:\SERVIDOR.TXT´);
ReWrite(ArquivoServidor);
WriteLn(ArquivoServidor, LbLocal.Text);
Finally
Closefile(ArquivoServidor);
end;

para alterar o arquivo e so q agora da erro I/O error 103, o mudou o erro mais continua não funcionando


Por favor, verifique os atributos do arquivo, veja se ele não está somente leitura, pq esse erro é o q o Massuda falou mesmo, o arquivo não está sendo aberto.

Boa sorte!!!


Joaoshi
   - 22 fev 2006

Colega se você ainda não sevolveu tente isto antes do CloseFile(ArquivoServidor).

FlushFileBuffers(TTextRec(ArquivoServidor).Handle);

Espero ter ajudado.


Kitsystem
   - 22 fev 2006

Vc esta tentando debugar o IoResult e ira dar isto mesmo

Coloque ele em uma variavel

var iErro: Integer

iErro:=Ioresult
Case iErro of
//aqui vc pega no Help todos os erros, os codigos de erro vc acha até no Turbo pascal


Marcal
   - 23 fev 2006

Amigo KitSystem sim fiz este teste ele ta dando o erro 32 realmente e problema de arquivo ja em uso eu fiz o que nosso amigo João disse mais não resolveu, mais fis uma mudança e achei interessante mais continua o mesmo problema ao inves do arquivo chamar servidor.TXT eu mudei pra .PET uma istenção q eu inventei ai acontence o seguinte quando tento alterar o arquivo ele criar um outro arquivo so com o nome SERVIDOR´.pet e pronto e continua dando o erro de I/O mais agora não entendo pq cria este arquivo.


Marcal
   - 24 fev 2006

Amigos alguem tem então alguma outra solução similar mesmo q seja mais complicada mais q resolva por exemplo tentei excluir o arquivo deposi de lido e depois cria-lo e editar mais não deu certo então alguem tem uma solução ja testei esse procedimento de ler e depois editar em outro pc mais acontece o mesmo erro


Michael
   - 24 fev 2006

Refiz seu exemplo, assim como o colega Martins fez, aqui e tbm não obtive nenhum erro.

#Código

procedure TForm1.Button1Click(Sender: TObject);
var
Arquivo: TextFile;
S: string;
begin
AssignFile(Arquivo, ´C:\Arquivo.txt´);
try
Reset(Arquivo);
ReadLn(Arquivo, S);
ShowMessage(S);
finally
CloseFile(Arquivo);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
Arquivo: TextFile;
S: string;
begin
S := ´Michael Benford´;
AssignFile(Arquivo, ´C:\Arquivo.txt´);
try
Reset(Arquivo);
WriteLn(Arquivo, S);
finally
CloseFile(Arquivo);
end;
end;


Há mais alguma coisa que vc esteja fazendo além disso?

[]´s