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:

Código: Selecionar todos

nHandle := FOPEN("Temp.txt", FO_READWRITE)
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