La idea gira en torno a esto, para hacer respaldos periódicos, manteniendo al menos 3 ( yo usé 5) versiones anteriores de una base de datos SQLite3, decidí que para ello debería cambiar el nombre en una carpeta de respaldo, creando dicha carpeta si fuese necesario.
El formato de nombres es "yyyy-mm-dd" agregándole "_" y un numero de control o versión que está determinado por el máximo nro de respaldos permitidos.
Conseguir el respaldo mas viejo así es como pelar mandarinas, obtener el nro correcto de versión también.
Pero.... Siempre hay un pero.... Cdate de fechas en este formato "yyyy-mm-dd" no es admitido, cierto que hay formas de hacerlo como por ejemplo ir extrayendo la fecha tramo a tramo con Left y Right, pero es mucho trabajo.
La clase cuenta con 3 propiedades y un método.
Ahhh y falta la clase Restore.
Bueno aquí va el código de la clase BackUp.
' gambas class file
'' Basado en la clase respaldo de Vector
' Esta clase contiene un método público y
' 3 propiedades publicas, RutaOrigen, RutaDestino y Frecuencia
Property RutaOrigen As String
Property Frecuencia As Integer
Property RutaDestino As String
Private $Frecuencia As Integer ' Indica si es diario, semanal, mensual o uno extraordinario.
Private $RutaOrigen As String
Private $RutaDestino As String ' Contiene solo el camino al directorio dode se depositara el respaldo
Private $MaxRespaldos As Integer
Private $Control As Integer ' Contiene el numero de control de respaldo
Private $NombreArchivo As String ' Contiene según el avance del proceso el nombre del respaldo mas viejo y luego el mas nuevo
Private $Rutafinal As String ' Contiene el camino + el nombre el archivo de respaldo
Private $PrimeraRonda As Integer ' Se trata de una bandera que estará encendida solo mientras mientras MaxRespaldos
' sea mayor que el total de archivos
Public Sub _new(Frecuencia As Integer, RutaOrigen As String, RutaDestino As String)
$Frecuencia = Frecuencia
$RutaOrigen = RutaOrigen
$RutaDestino = RutaDestino
$NombreArchivo = File.BaseName($RutaOrigen)
$MaxRespaldos = 5
End
Private Function Frecuencia_Read() As Integer
Return $Frecuencia
End
Private Sub Frecuencia_Write(Valor As Integer)
$Frecuencia = Valor
End
Private Function RutaOrigen_Read() As String
Return $RutaOrigen
End
Private Sub RutaOrigen_Write(Valor As String)
$RutaOrigen = Valor
End
Private Function RutaDestino_Read() As String
Return $RutaDestino
End
Private Sub RutaDestino_Write(Valor As String)
$RutaDestino = Valor
End
Public Sub Respaldar() ' Único método publico de la clase
If Existe Then
If Not $PrimeraRonda Then
$NombreArchivo = RespaldoMasViejo()
Kill $RutaDestino &/ $NombreArchivo
Endif
Endif
$RutaFinal = $RutaDestino &/ Construye()
Wait 0.2
Copy $RutaOrigen To $RutaFinal
End
Private Sub Existe() As Boolean ' Valida que exista un directorio para almacenar los archivos, en caso contrario lo crea
Dim zz As Integer
If Right$($RutaDestino, 8) <> "Respaldo" Then
$RutaDestino = $RutaDestino &/ "Respaldo"
Try Mkdir $RutaDestino
If Error Then
zz = Message.Error("No se ha podido crear el directorio de respaldo", "Finalizar")
Quit
Endif
Return False
Else
Return True
Endif
End
Private Function RespaldoMasViejo() As String ' Extrae si existe el nombre del respaldo mas viejo para su substitución.
Dim larchivos As String[]
Dim nombre As String
larchivos = Dir($RutaDestino).Sort(gb.Ascent)
nombre = larchivos[0]
Return nombre
End
Private Function Construye() As String ' Se encarga de contruir el nombre del nuevo respaldo y maneja una bandera para la primera ronda
Dim nom As String
Dim larchivos As String[]
larchivos = Dir($RutaDestino).Sort(gb.Ascent)
If larchivos.Count < $MaxRespaldos Then
$Control = larchivos.Count + 1
$PrimeraRonda = True
Else
$PrimeraRonda = False
$Control = Val(Right$($NombreArchivo, 1))
Endif
nom = Format$(Now, "yyyy-mm-dd") & "_" & Str($Control)
Return nom
End
'' Basado en la clase respaldo de Vector
' Esta clase contiene un método público y
' 3 propiedades publicas, RutaOrigen, RutaDestino y Frecuencia
Property RutaOrigen As String
Property Frecuencia As Integer
Property RutaDestino As String
Private $Frecuencia As Integer ' Indica si es diario, semanal, mensual o uno extraordinario.
Private $RutaOrigen As String
Private $RutaDestino As String ' Contiene solo el camino al directorio dode se depositara el respaldo
Private $MaxRespaldos As Integer
Private $Control As Integer ' Contiene el numero de control de respaldo
Private $NombreArchivo As String ' Contiene según el avance del proceso el nombre del respaldo mas viejo y luego el mas nuevo
Private $Rutafinal As String ' Contiene el camino + el nombre el archivo de respaldo
Private $PrimeraRonda As Integer ' Se trata de una bandera que estará encendida solo mientras mientras MaxRespaldos
' sea mayor que el total de archivos
Public Sub _new(Frecuencia As Integer, RutaOrigen As String, RutaDestino As String)
$Frecuencia = Frecuencia
$RutaOrigen = RutaOrigen
$RutaDestino = RutaDestino
$NombreArchivo = File.BaseName($RutaOrigen)
$MaxRespaldos = 5
End
Private Function Frecuencia_Read() As Integer
Return $Frecuencia
End
Private Sub Frecuencia_Write(Valor As Integer)
$Frecuencia = Valor
End
Private Function RutaOrigen_Read() As String
Return $RutaOrigen
End
Private Sub RutaOrigen_Write(Valor As String)
$RutaOrigen = Valor
End
Private Function RutaDestino_Read() As String
Return $RutaDestino
End
Private Sub RutaDestino_Write(Valor As String)
$RutaDestino = Valor
End
Public Sub Respaldar() ' Único método publico de la clase
If Existe Then
If Not $PrimeraRonda Then
$NombreArchivo = RespaldoMasViejo()
Kill $RutaDestino &/ $NombreArchivo
Endif
Endif
$RutaFinal = $RutaDestino &/ Construye()
Wait 0.2
Copy $RutaOrigen To $RutaFinal
End
Private Sub Existe() As Boolean ' Valida que exista un directorio para almacenar los archivos, en caso contrario lo crea
Dim zz As Integer
If Right$($RutaDestino, 8) <> "Respaldo" Then
$RutaDestino = $RutaDestino &/ "Respaldo"
Try Mkdir $RutaDestino
If Error Then
zz = Message.Error("No se ha podido crear el directorio de respaldo", "Finalizar")
Quit
Endif
Return False
Else
Return True
Endif
End
Private Function RespaldoMasViejo() As String ' Extrae si existe el nombre del respaldo mas viejo para su substitución.
Dim larchivos As String[]
Dim nombre As String
larchivos = Dir($RutaDestino).Sort(gb.Ascent)
nombre = larchivos[0]
Return nombre
End
Private Function Construye() As String ' Se encarga de contruir el nombre del nuevo respaldo y maneja una bandera para la primera ronda
Dim nom As String
Dim larchivos As String[]
larchivos = Dir($RutaDestino).Sort(gb.Ascent)
If larchivos.Count < $MaxRespaldos Then
$Control = larchivos.Count + 1
$PrimeraRonda = True
Else
$PrimeraRonda = False
$Control = Val(Right$($NombreArchivo, 1))
Endif
nom = Format$(Now, "yyyy-mm-dd") & "_" & Str($Control)
Return nom
End
En mi caso tengo un botón en la forma que asigna los valores correspondientes y luego los guarda en un archivo settings personalizado para la aplicación completa incuido el respaldo y otras cosas.
Public Sub Button1_Click()
If Button1.Text = "Respaldo" Then
libherr.Respaldo1.Frecuencia = ComboBox1.Index
libherr.Respaldo1.RutaOrigen = Application.Path & "/sgipcDB/sigpc"
libherr.Respaldo1.RutaDestino = ButtonBox1.Text
sgipc["Respaldo/Frecuencia"] = libherr.Respaldo1.Frecuencia
sgipc["Respaldos/RutaOrigen"] = libherr.Respaldo1.RutaOrigen
sgipc["Respaldos/RutaDestino"] = libherr.Respaldo1.RutaDestino
sgipc.Save
Endif
End
If Button1.Text = "Respaldo" Then
libherr.Respaldo1.Frecuencia = ComboBox1.Index
libherr.Respaldo1.RutaOrigen = Application.Path & "/sgipcDB/sigpc"
libherr.Respaldo1.RutaDestino = ButtonBox1.Text
sgipc["Respaldo/Frecuencia"] = libherr.Respaldo1.Frecuencia
sgipc["Respaldos/RutaOrigen"] = libherr.Respaldo1.RutaOrigen
sgipc["Respaldos/RutaDestino"] = libherr.Respaldo1.RutaDestino
sgipc.Save
Endif
End
ahora bien, por el momento estoy cansado y algo abrumado por lo siguiente; quiero que el respaldo sea o lo primero que se haga cada vez que le toque o bien lo último que haga en la misma circunstancia. Lo mas seguro es que se haga al finalizar el día de trabajo, pero es justo lo que nadie quiere.... Pero no quiero andar haciendo maniobras raras para evitar que cada vez el o los usuarios entren se haga un respaldo, misma situación a salir del sistema.... Tengo que pensar en eso aunque cualquier idea será bien recibida, así mismo tengo que preparar la clase Restore, auque esta será mucho mas corta y mas fácil de producir. Solo me preocupa ese asunto del usuario entrando y saliendo...
Saludos
PD.
Que conste que en mi programa si está indentado.... jajajaja