Página 1 de 1
Identificar c o arq estah aberto
Enviado: 08 Jul 2008 00:05
por marcos.gurupi
Como fico sabendo por exemplo em uma rede de 20 micros c um determinado arquivo (dbf) estah aberto?
Marcos Roberto.
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 08:22
por gvc
Como vc não especificou se é no sistema ou na rede, então:
No sistema, vc pode colocar select(<alias>)
Retorna Zero se não estiver aberto ou o número da área se estiver.
Na rede, se for novell, é pelo rconsole (conection type / avaliable servers / avaliable options / file open - lock activity / select an entry )
Se for Linux, eu já vi o pessoal aqui sofrer um pouco, mas acharam os usuários de um determinado arquivo.
Se tiver como fazer isso em uma P2P, eu gostaria muito de saber.
Boa sorte. Espero ter ajudado.
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 11:05
por marcos.gurupi
Na verdade eh em rede, ou seja, nao eh possivel!!
Marcos Roberto.
Enviado: 08 Jul 2008 11:21
por Maligno
Se você analisar bem, verá que nem sempre essa informação é útil. Se descobre que um certo arquivo está aberto, no milissegundo seguinte ele poderá já ter sido fechado e você tomará uma decisão com base em uma falsa informação. Já que é rede, não há garantia. Agora, dependendo do que pretende fazer, talvez o melhor seja bloquear a abertura deste com o uso de semáforos.
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 12:01
por sygecom
marcos.gurupi escreveu:Como fico sabendo por exemplo em uma rede de 20 micros c um determinado arquivo (dbf) estah aberto?
Marcos Roberto.
Eu verefico assim:
Código: Selecionar todos
TRY
use ENTRADAS alias ENTRANDA excl new
catch e
MsgInfo("Arquivo ENTRADA em Uso na Rede !!!")
RETURN
END
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 15:04
por marcos.gurupi
Como citei acima eu estou desenvolvendo uma rotina de backup e como o meu sistema ao ser iniciado abre todos os dbf, eles n poderiam estah aberto na hora do backup, ou seja, no momento q o usuario fosse fazer o backup o sistema faria uma busca e se houvesse algum dbf aberto o backup n iniciaria. Vou testar o exemplo do colega Leonardo. Obrigado.
Marcos Roberto
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 15:11
por marcos.gurupi
Segue uma resposta q tive na lista do xhb:
tche,
achei no help do xharbour essa função: DbRLockList()
ela retorna uma lista em um array dos registros bloqueados ... daí, fica
fácil testar ... use a NetErr() pra saber se a tabela está aberta em modo
exclusivo e DbRLockList() para saber se, passando no teste do NetErr() que
avisou termos uma tabela não aberta ou em modo compartilhado, se algum dos
registros dela está bloqueado ... em caso negativo, o acesso é pleno ...
executa um FLOCK() imediatamente para evitar que outro usuário resolva
utilizar a mesma ...
[]'s
Márson de Paula
Re: Identificar c o arq estah aberto
Enviado: 08 Jul 2008 17:52
por MARCELOG
Caro Marcos, beleza!
Vi a sua chamada no news e respondi.
Agora, se é prá backup, ou você faz como o Leonardo, ou seja, tenta usar o arquivo no modo exclusivo ou simplesmente faz o backup.
Se o uso exclusivo falhar é porque o arquivo está em uso por outro usuario no modo exclusivo ou compartilhado, então avise e pronto.
Agora, se é só backup, s.m.j. (sem maiores justificativas), não é preciso usar o arquivo exclusivamente, bastar ler os registros e gravar/ compactar, ou seja lá qual for o método que você usa e pronto uai.
MarceloG
Enviado: 08 Jul 2008 18:17
por Maligno
Abrir o arquivo em modo exclusivo apenas garante que ele não estava aberto antes do back-up. Se o programa de back-up precisa do arquivo fechado, ele terá de ser fechado e, no milissegundo seguinte ele pode ser aberto por alguém. Ou seja, não adiantou nada abrir em modo exclusivo. Seria melhor, a meu ver, ter um mecanismo para bloquear a abertura de arquivos, até que o back-up se complete. Um semáforo.
Identificar o uso de arquvio de dados para backup
Enviado: 15 Jul 2008 10:13
por Pablo César
Para esse caso de realização de backup, eu faço como o Maligno mencionou (SEMAFORO + READONLY). Isto é, utilizo a criação de um arquivo que determina uso EXCLUSIVO e na existência dele, niniguém mais pode entrar apartir disso (isto eu denomino> SEMAFORO) e logo no meu sistema de backup verifico todos os arquivos DBF abrindo-os em modo exclusivo (como indicou o sygecom) se não retornar erro prosigo com o backup, senão dou uma mensagem em tela, dizendo que tal arquivo está sendo acessado, inclusive posso determinar que é que está acessando (qual é a estação e nome de usuário), isto consigo porque para cada estação que abre algum DBF crio um arquivo no servidor com nome da estação e o seu conetúdo é o nome do usuário. Continuando, visto a impossibilidade de realização de um backup com sucesso, saiu do programa de backup deletando aquele arquivo PARATUDO.SYS. Claro que no meu sistema, antes de abrir algum arquivo, verifica a existência desse arquivo.
Re: Identificar c o arq estah aberto
Enviado: 18 Jul 2008 21:29
por rochinha
Amiguinhos,
Gurupi - Voce tem algum exemplo de uso desta dbRLockList()? Posta ai.
Bom no meu sistema, na reorganização eu uso alguns meios de travar os arquivos e testa-los.
Primeiro eu testo os arquivos que vou reorganizar verificando em baixo nivel se estão travados. Estando travados minha rotina fica em loop travando outros arquivos, até estar apta a iniciar o processo.
Faço esta verificação e marcação diretamente em meu arquivo de indices que contem os nomes, chaves, indices de cada arquivo que necessita de indices.
O uso de um arquivo .DBF contendo informações sobre os indices me ajuda a alteração e manutenção de chaves, etc e como uso .CDX fica muito fácil a abertura, eliminando programação via código.
Eu uso este trecho para testar se o arquivo esta travado:
Código: Selecionar todos
FUNCTION dblocked( dbf )
ldbf := FOPEN( dbf, 1 )
IF FERROR() <> 0
RETURN .t.
ENDIF
FCLOSE(ldbf)
RETURN .f.
Quando minha rotina de reorganização entra em ação ela gera um arquivo/trava que só é liberado no final do processo:
Código: Selecionar todos
FUNCTION Indexando(Indexando)
retorno = .t.
if Indexando = NIL
return iif(file("index.log"), .t., .f.)
else
if Indexando = .t.
errhandle = fcreate("index.log")
fwrite(errhandle,"indexando arquivos")
fclose(errhandle)
else
ferase("index.log")
endif
endif
RETURN retorno
Quando quero iniciar o processo uso
Indexando(.t.) e para testar se a reorganização esta ocorrendo uso
if Indexando