Página 1 de 1
Testando o TXT antes de escrever nele
Enviado: 13 Set 2010 15:44
por Mário Isa
Se tento escrever (memowrit) em um arquivo .TXT tipo TESTE.TXT (mas se ele está aberto por um outro aplicado com o Word) provoca o erro: Dos Error 32.
Tem como testar o arquivo TESTE.TXT (para ver se ele está aberto por um outro) antes de escrever nele ?
Obrigado.
Mário
Re: Testando o TXT antes de escrever nele
Enviado: 13 Set 2010 18:08
por alxsts
Olá!
É possível abrir o arquivo de várias maneiras, no que se refere a compartilhamento. Olhe o arquivo FileIO.Ch, na pasta include. Veja um exemplo extraido do NG:
Código: Selecionar todos
#include "Fileio.ch"
//
nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_DENYWRITE)
IF FERROR() != 0
? "Cannot open file, DOS error ", FERROR()
BREAK
ENDIF
Re: Testando o TXT antes de escrever nele
Enviado: 13 Set 2010 22:19
por Mário Isa
ok Alexandre. Obrigado pela Dica.
Pretendo montar / com a função que vc enviou / uma função que testa se o arquivo pode ser aberto.
Para fechá-lo eu faria:
fclose(nHandle)
seria isso ?
Máro
Re: Testando o TXT antes de escrever nele
Enviado: 13 Set 2010 22:33
por alxsts
Olá!
Você poderá colocar dentro de um
loop
Código: Selecionar todos
#include "Fileio.ch"
//
LOCAL nHandle, nOpt := 1
WHILE nOpt == 1
nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_DENYWRITE)
IF nHandle == -1
nOpt := Alert( "Falha ao abrir arquivo.;Deseja tentar novamente?", { " Sim "," Não " } )
ENDIF
ENDDO
// Se conseguiu abrir o arquivo
IF nHandle > 0
// ... demais comandos...
// fecha arquivo
FClose( nHandle )
ENDIF
Re: Testando o TXT antes de escrever nele
Enviado: 14 Set 2010 08:11
por Mário Isa
Alexandre, obrigado pela ajuda.
Deu certíssimo.
Agora consegui sanar o problema de que quando alguem ia imprimir, mas estava editando o arquivo com outro aplicativo provocava erros....
Chik d+
:-Y
Re: Testando o TXT antes de escrever nele
Enviado: 14 Set 2010 09:34
por alxsts
Olá!
Bom saber que deu certo.
Não estou vendo o teu aplicativo nem conheço a necessidade mas, parece que você abre o arquivo sempre com o mesmo nome, no mesmo local de rede. Assim, se mais de um usuário acessar a rotina simultaneamente, o arquivo já estará em uso. Talvez fosse melhor gerar nomes variáveis, através do uso de um gerador de números randômicos. Dessa forma, cada instância da rotina teria o seu próprio arquivo que, ao término do processamento, seria excluído.
Re: Testando o TXT antes de escrever nele
Enviado: 14 Set 2010 16:07
por billy1943
O que ainda você pode fazer é colocar no nome do .TXT que você pretende abrir, o número do terminal em operação, pois aí você tem a garantia que, ao menos no seu terminal, ninguém pode estar com esse arquivo aberto;
Coloque esse número de terminal pelo comando do DOS -> set terminal=1
incluido no batch que chama o programa, junto com outras variáveis necessárias.
Na montagem do nome insira o número: exemplo:
nome_arqui := "teste" + strzero(terminal,2,0) + ".txt" ------> teste01.txt será único no seu sistema de rede
P.S. Esse arquivo pode ser local ou da rede, sem problemas.
Re: Testando o TXT antes de escrever nele
Enviado: 15 Set 2010 07:54
por Mário Isa
parece que você abre o arquivo sempre com o mesmo nome, no mesmo local de rede
Não! eu tenho um arquivo para cada estação.
no meu sistema eu tenho uma variável que se chama
estacao = 'TERMx'
onde x = o numero da estação atual
e o arquivo de texto que eu utilizo se chama
TLTERMx.TXT
onde x = idem
Ocorre que alguns, sabendo que o relatório está em TLTERMx.TXT abrem-no com outro aplicativo para editá-lo, mesmo apesar de isso não ser mais necessário pois atualmente, se o usuário quiser pode "exportar" o relatório direto pelo Word (faço pelo DOSPRINT). Mas de qualquer forma, lá de vez enquando, eles ainda tem o costume de editar o TLTERMx.TXT / e porisso a função
E por falar nisso, tive que mudar a função onde se lê:
Código: Selecionar todos
nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_DENYWRITE)
Tive que mudar para:
Pois com o DENYWRITE, mesmo fechando FCLOSE (nhandle) o arquivo ainda permanecia aberto e não era liberado para escrita.
De qualquer forma ficou ótimo e muito bom! A ajuda foi excelente.
Obrigado.
Mário