Crear copia de seguridad

Iniciado por jrhomer, 7 Noviembre 2006, 09:21 AM

0 Miembros y 2 Visitantes están viendo este tema.

jrhomer

Hola foro...

intento hacer una pequeña aplicación para que me haga una copia de seguridad de una archivo en concreto (ese aechivo es un mdb) que uso con otra aplicación.

no tendría problemas si hago la copia cuando estoy trabajando con la aplicación principal... pero implicaría que siempre que quiera hacer una copia debería ejecutar esa aplicación.

Lo que me gustaria hacer es un procedimiento automático para que caba vez que se inicia el PC se ejecute ese procedimiento y se realice la copia de seguridad.

Por ejemplo que todos los días a las 12:00 me haga esa copia.

Para hacer esto es para lo que tengo problemas...

me podeis echar una mano??? y guiarme para ver por donde van los tiros?

un saludo.
ups!!

Gorky

Creo que te puedo dar la solucion.

Para que se te ejecute en el inicio vas a escribir en la entrada de registro "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run". Esto lo puedes hacer con la API RegSetValueEx.

Para que sea a una hora en concreto lo vas a hacer con la API GetSystemTime y comparando el valor que te devuelve con la hora que tu quieras.

Creo que con eso tienes el problema solucionado.

Si tienes alguna duda al respecto pregunta.

jrhomer

Muchas gracias Gorky, probaré con la API.

Voy a buscar información sobre esas funciones y lo pruebo.
ups!!

jrhomer

Es la primera vez que trabajo con esto del registro..... no comprendo como tengo que usar RegSetValueEx y GetSystemTime...

podrias ponerme un ejemplo de como hacerlo? y donde tengo que hacerlo? ya que si lo hago en mi aplicación... si no la ajecuto no se creará la copia de seguridad....

perdona, pero ando bastante perdido en este tema.
ups!!

Gorky

Bajate esto y te informas: http://www.allapi.net/downloads/apiguide/agsetup.exe

Si despues sigues teniendo dudas vuelves a preguntar.

PD.: Entre una respuesta tuya y otra hay muy poco tiempo y dudo mucho que te haya dado tiempo a poder investigar. Es lo primero que deberias ponerte a hacer.

CeLaYa

mira yo tengo algo parecido, solo que uso una base de datos del SQL

'Apis
'==================================
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long

'PROCESOS
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'PAUSA
Public Declare Function GetTickCount Lib "Kernel32.dll" () As Long

Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400



Private Sub cmdRespaldo_Click()
    'Determinar el nombre de la base de datos
    Dim b As Long, strPath As String * 255
    Dim Archivo As String
   
    On Local Error Resume Next
   
    b = GetShortPathName(fbDir.Text, strPath, Len(strPath))
    strPath = Left$(strPath, b)
   
    If Trim(strPath) = "" Then
        MsgBox "Directorio no valido", vbCritical + vbOKOnly, App.EXEName
        Exit Sub
    End If
   
    GetAttr (Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy") & ".zip")
    If Err.Number = 0 Then
        b = MsgBox("¿El archivo de respaldo ya existe, desea sobreescribirlo?", vbQuestion + vbYesNoCancel, App.EXEName)
        Select Case b
            Case 6 ' Si
                Archivo = Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy")
            Case 7 ' No
                Archivo = InputBox("Teclee el nombre del archivo de respaldo (sin extensión).", "Crear Respaldo", "")
                If Trim(Archivo) = "" Then
                    Exit Sub
                Else
                    Archivo = Trim(strPath) & Archivo
                End If
            Case 2 ' Cancelar
                Exit Sub
        End Select
    Else
        Archivo = Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy")
    End If
    'Exit Sub
    If AbrirBD(Acceso.LecturaEscritura) <> 0 Then Exit Sub
   
    'Crear respaldo de la base de datos
    On Local Error Resume Next
   
    lblProgres.Caption = "Creando copia de seguridad..."
    ProgressBar1.Value = 1
    DoEvents
   
    BD.Execute "BACKUP DATABASE [Indicadores] TO DISK = N'" & Archivo & ".bak ' " & _
               "WITH  NOINIT, NOUNLOAD, NAME = N'Respaldo" & Format(Date, "ddMMyyyy") & "', " & _
               "NOSKIP, STATS = 10, DESCRIPTION = N'Respaldo', NOFORMAT"
    DoEvents
    If Err Then
        MsgBox BD.Errors(0).Number & vbCrLf & BD.Errors(0).Description, vbCritical + vbOKOnly, App.EXEName
    Else
        ' Coomprimir la base de datos .bak
       
        lblProgres.Caption = "Comprimiendo archivo..."
        ProgressBar1.Value = 2
        DoEvents
       
        'Ejecuta el comando MSDOS
        ExeEspera "c:\archiv~1\winzip\winzip32.exe -a -r " & Archivo & ".zip " & Archivo & ".bak"
       
        lblProgres.Caption = "Borrando archivos temporales..."
        ProgressBar1.Value = 3
        DoEvents
       
        Kill Archivo & ".bak"
       
        lblProgres.Caption = "Proceso terminado"
        ProgressBar1.Value = 4
        DoEvents
       
    End If
   
    On Local Error GoTo 0
    CerrarBD
   
End Sub


Private Function ExeEspera(COMANDO As String)
    Dim hProcess As Long
    Dim RetVal As Long
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(COMANDO, vbMinimizedNoFocus))
    Do
        GetExitCodeProcess hProcess, RetVal
        DoEvents
        Pausa 100
    Loop While RetVal = STILL_ACTIVE
End Function

"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

jrhomer

Sigo liado con esto y no consigo sacar nada en claro, podrias ponerme un ejemplo de como hacerlo? y donde tengo que hacerlo? ya que si lo hago en mi aplicación... si no la ajecuto no se creará la copia de seguridad....

ando algo perdido en esto
ups!!

CeLaYa

y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
"La soledad es el elemento de los grandes talentos".
Cristina de Suecia (1626-1689) Reina de Suecia.

jrhomer

Cita de: CeLaYa en 13 Noviembre 2006, 19:04 PM
y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
está deberá ser la solución, ya que no consigo controlar que me me propuso Gorky.
ups!!

Gorky

Cita de: jrhomer en 15 Noviembre 2006, 10:35 AM
Cita de: CeLaYa en 13 Noviembre 2006, 19:04 PM
y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
está deberá ser la solución, ya que no consigo controlar que me me propuso Gorky.

Venga te lo facilito un poco.

Esto lo tienes que colocar en la cabecera, antes de Option Explicit:

Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME)
Private Const HKEY_LOCAL_MACHINE = &H80000002


Y esto en el cuerpo:


Dim h As Long
Dim buffer As String
RegOpenKey HKEY_LOCAL_MACHINE, "software\microsoft\windows\currentversion\run", h
RegSetValueEx h, "nombre_de_la_entrada", 0, 1, ByVal "C:\WINDOWS\system32\programa.exe", Len("C:\WINDOWS\system32\programa.exe")
RegCloseKey h


Con eso haces que se te ejecute en cada inicio.

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type
Dim MyTime As Tiempo
GetLocalTime Tiempo
If Tiempo.wDay = 12 And Tiempo.wMinute = 0 Then
FileCopy App.Path & "\" & App.EXEName & ".exe", "C:\WINDOWS\system32\programa.exe"
End If


Y con eso haces que a las doce se te copie en la ruta que le hayas dicho.

Ya por co***es tienes que saber hacerlo. De todas formas si no lo consigues pregunta de nuevo.