Testando o TXT antes de escrever nele
Moderador: Moderadores
-
Mário Isa
- 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
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
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Testando o TXT antes de escrever nele
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:
É 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)
Alexandre Santos (AlxSts)
-
Mário Isa
- 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
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
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Testando o TXT antes de escrever nele
Olá!
Você poderá colocar dentro de um loop
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)
Alexandre Santos (AlxSts)
-
Mário Isa
- 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
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
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

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Re: Testando o TXT antes de escrever nele
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.
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)
Alexandre Santos (AlxSts)
Re: Testando o TXT antes de escrever nele
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.
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.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
-
Mário Isa
- 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
Não! eu tenho um arquivo para cada estação.parece que você abre o arquivo sempre com o mesmo nome, no mesmo local de rede
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)Código: Selecionar todos
nHandle := FOPEN("Temp.txt", FO_READWRITE)De qualquer forma ficou ótimo e muito bom! A ajuda foi excelente.
Obrigado.
Mário