Excelente amigo, muchas gracias
Bueno, por hoy ya he terminado, te explico hasta donde he llegado:
Tengo finalizado el programa para generar automáticamente el updater.lst, básicamente tú le indicas la carpeta donde tienes instalado el programa actualizado y te genera un fichero con el siguiente contenido:
vb6.jpg
151089
$7764735F
whatsnew.txt
51
$54FF24BD
windowslogo.png
151053
$A07BF49A
fotos\executable.jpg
94423
$F7F46B42
fotos\foto_linux.jpeg
81570
$A2963B48
hola\virusfoto.jpg
114480
$3B9600A0
No tienes que editarlo a mano, ya que el programa te lo calcula automáticamente, aparece el fichero y su ruta, tamaño y el CRC32, con esas 3 datos ya funciona correctamente el updater.
Y luego, el programa (actualizador principal) funciona d ela siguiente manera; se descarga el updater.lst y lee el fichero de 3 en 3 líneas, en cada lectura obtiene el fichero, tamaño y CRC, los compara con el fichero local y si uno de los 3 datos no es correcto, descarga la copia del fichero en remoto (el fichero actualizado). Si el fichero está dentro de una carpeta, también crea la carpeta y actualiza los ficheros de su interior.
** Por el momento el programa trabaja con los ficheros de la raíz y un 1º nivel de sub-carpeta, mañana cuando vuelva del trabajo hago un bucle recursivo para que pueda ir desde el nivel 2 de sub-carpeta hasta el nivel N (infinito).
El programa acepta el parámetro /auto para que auto-actualice y si descarga el fichero whatsnew.txt lo ejecuta y lo muestra al usuario para que vea los cambios actualizados.
El programa sirve como WebInstaller o Actualizador, puede actualizar incluso si la aplicación principal está en ejecución. Cosas que me faltan terminar?
- Nivel N-Subcarpeta (mañana lo termino)
- Posibilidad de auto-actualizar el propio instalador. (No se hasta que punto es interesante implementar la opción...)
El código es "bonito", corto y sencillo. Como a mi me gustan, es el siguiente:
Function StartUpdate()
Dim RootPath As String
Dim WhatsNew As Boolean
Set Files = CreateObject("Scripting.FileSystemObject")
WhatsNew = False
m_CRC.Algorithm = 1
Open App.Path & "\smart.cfg" For Input As #1
Line Input #1, RootPath
Close #1
DoEvents
If DownloadFile(RootPath & "updater.lst", "updater.lst") = False Then
MsgBox "Error al descargar el fichero de actualización"
Else
Open App.Path & "\updater.lst" For Input As #1
Do While Not EOF(1)
Line Input #1, Archivo
Line Input #1, Bytes
Line Input #1, CRC
Label1.Caption = Archivo & " (" & Bytes & ") = " & CRC
If Files.FileExists(App.Path & "\" & Archivo) Then
If FileLen(App.Path & "\" & Archivo) = Bytes Then
CRC2 = "$" & Hex(m_CRC.CalculateFile(App.Path & "\" & Archivo))
If CRC <> CRC2 Then
Call DownloadFile(RootPath & Archivo, Archivo)
If Archivo = "whatsnew.txt" Then WhatsNew = True
End If
Else
Call DownloadFile(RootPath & Archivo, Archivo)
If Archivo = "whatsnew.txt" Then WhatsNew = True
End If
Else
Call DownloadFile(RootPath & Archivo, Archivo)
If Archivo = "whatsnew.txt" Then WhatsNew = True
End If
DoEvents
Loop
Close #1
DoEvents
Kill App.Path & "\updater.lst"
If WhatsNew = True Then ShellExecuteA 0&, "Open", App.Path & "\whatsnew.txt", vbNullString, vbNullString, 1
End If
End Function
Function DownloadFile(ByVal URL As String, ByVal Target As String) As Boolean
On Error GoTo dError
Set oHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
Set oStream = CreateObject("ADODB.Stream")
URL = Replace(URL, "\", "/")
oHTTP.Open "GET", URL, False
oHTTP.Send
If (oHTTP.Status = 200) Then
oStream.Open
oStream.Type = 1
oStream.Write oHTTP.ResponseBody
If InStr(Target, "\") > 0 And Target <> "updater.lst" Then
Call MkDir(Split(Target, "\")(0))
End If
oStream.SaveToFile App.Path & "\" & Target, 2
oStream.Close
DownloadFile = True
Exit Function
End If
dError:
DownloadFile = False
End Function
Por cierto, como has pensado en pagarme el trabajo que estoy haciendo? Yo no programo gratis... te mando un MP informando de mis precios por horas.
Saludos y hasta mañana!