cabecera dbf
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
cabecera dbf
Existe alguna funcion para cambiar/corregir la cabecera de las dbf de mi sistema para poder abrirlas "unicamente" desde el sistema o en dado caso regresarla a su forma original para abrirlas desde cualquier dbu para dbfs? lo quiero hacer por seguridad en lugar de encriptar todos los datos.
gracias
paco
gracias
paco
- Alfredo Arteaga
- Posts: 326
- Joined: Sun Oct 09, 2005 5:22 pm
- Location: Mexico
- Contact:
He aqui la función:
Code: Select all
FUNCTION DbProtect(cDbf,nAction)
LOCAL nHandle:=0, cFile
LOCAL cBuffer:=Space(32)
IF !File(cDbf)
nHandle:=FOpen(cFile,FO_READWRITE+FO_SHARED)
DEFAULT nAction:=1
IF nHandle!=-1
IF FRead(nHandle,@cBuffer,32)==32
IF nAction==0 // Proteger
IF SubStr(cBuffer,1,1)<>Chr(26)
cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
ENDIF
ELSE // Desproteger
IF SubStr(cBuffer,1,1)==Chr(26)
cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
ENDIF
ENDIF
FSeek(nHandle,0)
FWrite(nHandle,cBuffer,32)
ENDIF
FClose(nHandle)
ENDIF
ENDIF
RETURN (NIL)
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Que tal Manuel,
te comento como lo hago
1.tengo una funcion para abrir las dbf, antes de abrirla verifico si esta protegida con esto:
IF lFileProtect("MiArchivo.dbf")
DbProtect("MiArchivo.dbf",1) // con el 1 se desprotege
ENDIF
--> aqui ya abro la dbf
2. Al cerrar la dbf vuelvo a proteger la dbf
DbProtect("MiArchivo.dbf",0) // con el 0 se protege
aqui dejo las funciones del autor Alfredo Arteaga, gracias Alfredo.
FUNCTION lFileProtect(cDbf)
LOCAL nHandle :=0
LOCAL cBuffer :=Space(32)
LOCAL lRet :=.F.
IF (nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED))!=-1
IF FRead(nHandle,@cBuffer,32)==32
lRet:=IF(SubStr(cBuffer,1,1)==Chr(26),.T.,.F.)
ENDIF
FClose(nHandle)
ELSE
MsgInfo("Error, No se pudo abrir la Base de Datos "+cDbf,"Verifique !!")
ENDIF
RETURN (lRet)
FUNCTION DbProtect(cDbf,nAction)
LOCAL nHandle:=0
LOCAL cBuffer:=Space(32)
nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED)
DEFAULT nAction:=1
IF nHandle!=-1
IF FRead(nHandle,@cBuffer,32)==32
IF nAction==0 // Proteger
IF SubStr(cBuffer,1,1)<>Chr(26)
cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
ENDIF
ELSE // Desproteger
IF SubStr(cBuffer,1,1)==Chr(26)
cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
ENDIF
ENDIF
FSeek(nHandle,0)
FWrite(nHandle,cBuffer,32)
ENDIF
FClose(nHandle)
ENDIF
RETURN (NIL)
Saludos
Paco
te comento como lo hago
1.tengo una funcion para abrir las dbf, antes de abrirla verifico si esta protegida con esto:
IF lFileProtect("MiArchivo.dbf")
DbProtect("MiArchivo.dbf",1) // con el 1 se desprotege
ENDIF
--> aqui ya abro la dbf
2. Al cerrar la dbf vuelvo a proteger la dbf
DbProtect("MiArchivo.dbf",0) // con el 0 se protege
aqui dejo las funciones del autor Alfredo Arteaga, gracias Alfredo.
FUNCTION lFileProtect(cDbf)
LOCAL nHandle :=0
LOCAL cBuffer :=Space(32)
LOCAL lRet :=.F.
IF (nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED))!=-1
IF FRead(nHandle,@cBuffer,32)==32
lRet:=IF(SubStr(cBuffer,1,1)==Chr(26),.T.,.F.)
ENDIF
FClose(nHandle)
ELSE
MsgInfo("Error, No se pudo abrir la Base de Datos "+cDbf,"Verifique !!")
ENDIF
RETURN (lRet)
FUNCTION DbProtect(cDbf,nAction)
LOCAL nHandle:=0
LOCAL cBuffer:=Space(32)
nHandle:=FOpen(cDbf,FO_READWRITE+FO_SHARED)
DEFAULT nAction:=1
IF nHandle!=-1
IF FRead(nHandle,@cBuffer,32)==32
IF nAction==0 // Proteger
IF SubStr(cBuffer,1,1)<>Chr(26)
cBuffer:=Chr(26)+SubStr(cBuffer,1,31)
ENDIF
ELSE // Desproteger
IF SubStr(cBuffer,1,1)==Chr(26)
cBuffer:=SubStr(cBuffer,2,31)+ Chr(0)
ENDIF
ENDIF
FSeek(nHandle,0)
FWrite(nHandle,cBuffer,32)
ENDIF
FClose(nHandle)
ENDIF
RETURN (NIL)
Saludos
Paco
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Karinha,
De hecho si, porque algunas dbf estarian sin bloqueo, pero o puedes controlar con un flag para si el sistema tuvo una salida anormal y antes de arrancar el sistema comprobar si estan protegidas o desprotegidas.
En caso de que sea en red (server sin ups, raro!!) desde cualqueir otra terminal con energia electrica puede seguir protegiendo y desprotegiendo sin problemas, ya que siempre busca la validacion de la misma
salu2
paco
De hecho si, porque algunas dbf estarian sin bloqueo, pero o puedes controlar con un flag para si el sistema tuvo una salida anormal y antes de arrancar el sistema comprobar si estan protegidas o desprotegidas.
En caso de que sea en red (server sin ups, raro!!) desde cualqueir otra terminal con energia electrica puede seguir protegiendo y desprotegiendo sin problemas, ya que siempre busca la validacion de la misma
salu2
paco
- José Vicente Beltrán
- Posts: 279
- Joined: Mon Oct 10, 2005 8:55 am
- Location: Algeciras, España
- Contact:
Hola a todos después de mucho tiempo.
Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD
De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.
Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas
Saludos
Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD
De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.
Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas
Saludos
-
- Posts: 845
- Joined: Sun Oct 09, 2005 5:36 pm
- Location: la laguna, mexico.
Luis,
Efectivamente como comenta vicente asi mismo funciona, el cambio de cabeceras las ejecutas dentro de las funciones al abrir y cerrar las bases de datos.. y siempre validas, por lo tanto aunque este en red, si una terminal va a usar determinada base de datos, verifica si esta o no cambiada la cabecera y tons aplica lo que se necesite.
salu2
paco
Efectivamente como comenta vicente asi mismo funciona, el cambio de cabeceras las ejecutas dentro de las funciones al abrir y cerrar las bases de datos.. y siempre validas, por lo tanto aunque este en red, si una terminal va a usar determinada base de datos, verifica si esta o no cambiada la cabecera y tons aplica lo que se necesite.
salu2
paco
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España
Jose Vicente, ¿puedes indicarnos como lo haces con detalle?José Vicente Beltrán wrote:Hola a todos después de mucho tiempo.
Yo lo que hago es:
1. cambiar la cabecera para poder abrir la base de datos
2. abrir la base de datos
3. cambiar la cabecera al estado anterior
4. trabajar normalmente con la BD
De esta forma si otros terminales de la red necesitan abrir la BD siempre se la encontrarán cerrada y pueden ejecutar los cuatro puntos anteriores.
Y por supuesto si hay fallo electrico y/o de red las BD siempre se quedan protegidas de las miradas curiosas
Saludos
Last edited by Manuel Valdenebro on Fri Dec 19, 2008 7:16 am, edited 1 time in total.
Un saludo
Manuel
Manuel
- José Vicente Beltrán
- Posts: 279
- Joined: Mon Oct 10, 2005 8:55 am
- Location: Algeciras, España
- Contact:
Basicamente hago lo siguiente:
//----------- para abrir la BD ------------------//
protege( "OFF", file ) //pone la cabecera normal
USE file NEW
protege( "ON", file ) //cambia la cabecera para impedir la apertura
//------------------------------------------------//
...
a partir de aquí uso normal
...
CLOSE file // fin de la aplicación
#include "FiveWin.ch"
#define PROT_SIN_DBT CHR(255)
#define PROT_CON_DBT CHR(254)
#define PROT_CON_FTP CHR(253)
#define DESPROT_SIN_DBT CHR(3)
#define DESPROT_CON_DBT CHR(131)
#define DESPROT_CON_FTP CHR(245)
//---------------------------------------------------------------------
function Protege(cModo, cFicheroDBF)
local nManejador, cCabecera, cescribe:= ""
//se abre el fichero a bajo nivel para lectura-escritura
nManejador = FOpen ( cFicheroDBF , 2 )
//Leemos el primer byte
cCabecera := FReadStr( nManejador , 1 )
if cModo == "ON" // busca codigo de protección
do case
case cCabecera == DESPROT_SIN_DBT
cEscribe := PROT_SIN_DBT
case cCabecera == DESPROT_CON_DBT
cEscribe := PROT_CON_DBT
case cCabecera == DESPROT_CON_FTP
cEscribe := PROT_CON_FTP
otherwise
Fclose ( nManejador )
return .T.
endcase
else // busca código de desprotección
do case
case cCabecera == PROT_SIN_DBT
cEscribe := DESPROT_SIN_DBT
case cCabecera == PROT_CON_DBT
cEscribe := DESPROT_CON_DBT
case cCabecera == PROT_CON_FTP
cEscribe := DESPROT_CON_FTP
otherwise
Fclose ( nManejador )
return .T.
endcase
endif
// mueve el puntero al principio del fichero
Fseek( nManejador, 0, 0 )
FWrite( nManejador, cEscribe, 1 )
Fclose( nManejador )
return .t.
//----------- para abrir la BD ------------------//
protege( "OFF", file ) //pone la cabecera normal
USE file NEW
protege( "ON", file ) //cambia la cabecera para impedir la apertura
//------------------------------------------------//
...
a partir de aquí uso normal
...
CLOSE file // fin de la aplicación
#include "FiveWin.ch"
#define PROT_SIN_DBT CHR(255)
#define PROT_CON_DBT CHR(254)
#define PROT_CON_FTP CHR(253)
#define DESPROT_SIN_DBT CHR(3)
#define DESPROT_CON_DBT CHR(131)
#define DESPROT_CON_FTP CHR(245)
//---------------------------------------------------------------------
function Protege(cModo, cFicheroDBF)
local nManejador, cCabecera, cescribe:= ""
//se abre el fichero a bajo nivel para lectura-escritura
nManejador = FOpen ( cFicheroDBF , 2 )
//Leemos el primer byte
cCabecera := FReadStr( nManejador , 1 )
if cModo == "ON" // busca codigo de protección
do case
case cCabecera == DESPROT_SIN_DBT
cEscribe := PROT_SIN_DBT
case cCabecera == DESPROT_CON_DBT
cEscribe := PROT_CON_DBT
case cCabecera == DESPROT_CON_FTP
cEscribe := PROT_CON_FTP
otherwise
Fclose ( nManejador )
return .T.
endcase
else // busca código de desprotección
do case
case cCabecera == PROT_SIN_DBT
cEscribe := DESPROT_SIN_DBT
case cCabecera == PROT_CON_DBT
cEscribe := DESPROT_CON_DBT
case cCabecera == PROT_CON_FTP
cEscribe := DESPROT_CON_FTP
otherwise
Fclose ( nManejador )
return .T.
endcase
endif
// mueve el puntero al principio del fichero
Fseek( nManejador, 0, 0 )
FWrite( nManejador, cEscribe, 1 )
Fclose( nManejador )
return .t.
- Manuel Valdenebro
- Posts: 706
- Joined: Thu Oct 06, 2005 9:57 pm
- Location: Málaga-España