Testando o TXT antes de escrever nele

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Testando o TXT antes de escrever nele

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Testando o TXT antes de escrever nele

Mensagem 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
[]´s
Alexandre Santos (AlxSts)
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: Testando o TXT antes de escrever nele

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Testando o TXT antes de escrever nele

Mensagem 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  
[]´s
Alexandre Santos (AlxSts)
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: Testando o TXT antes de escrever nele

Mensagem 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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Testando o TXT antes de escrever nele

Mensagem 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.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: Testando o TXT antes de escrever nele

Mensagem 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.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Mário Isa
Usuário Nível 4
Usuário Nível 4
Mensagens: 907
Registrado em: 07 Jul 2004 13:54
Localização: Ilha Solteira-sp

Re: Testando o TXT antes de escrever nele

Mensagem 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
Responder