Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: YAcosta en Septiembre 06, 2013, 12:28:34 am
-
¿Como podria saberlo?
Estoy usando el Filelen pero no me esta funcionando como esperaba.
Tengo este codigo dentro de un Timer a 2000 de interval preguntando sobre un archivo que se esta zipeando, este es un archivo de 250 megas y toma unos 10-15 segundos en terminar de zipearse y me he visto obligado a meterle 60 segundos antes de crear una copia de ese zipeado...
Dim Termino as Boolean
Termino = False
Do While Termino = False
If Len(Dir(RutaDestino)) > 0 Then 'Aqui el archivo rar
If memTamArchivo = 0 Then 'variable para almacenar el tamaño del archivo
memTamArchivo = FileLen(RutaDestino) 'la primera vez le asigno el tamaño que vaya teniendo el archivo rar
Else
If memTamArchivo = FileLen(RutaDestino) Then 'sino, pregunto si son iguales.
Termino = True
Call Espera(60) '***** parche leer abajo *********
FileCopy RutaDestino, RutaDropBox 'copio el archivo
Call Espera(5) 'Espero a que la copia se halla realizado
Kill RutaDestino 'elimino el archivo original
Else
memTamArchivo = FileLen(RutaDestino) ' si la igualdad no se cumple es que el archivo sigue creciendo
End If
End If
End If
Call Espera(5) ' 5 segundos para el siguiente loop.
Loop
***** El detalle es que la igualdad se cumplia a pesar de que el archivo aun no se habia terminado de crear totalmente segun voy observando en el explorador de windows, por ahora lo resolví haciendo esperar al loop 60 segundos antes de copiar el archivo para tener la seguridad de que se creó finalmente. El problema estará en un tiempo cuando el archivo crezca tanto que pase los 60 segundos, imagino que debe haber una forma ortodoxa de resolver esto.
La otra forma que se me ocurre resolverlo es que cuando el Winrar va creando el archivo lo hace de forma exclusiva por tanto no permite copiarlo, quizá alli podría capturar el error 70 de permiso denegado, pero no se si esta fuera una buena solución.
¿Que estoy haciendo mal? Lo que quiero es mover el archivo rar cuando este se halla terminado de crear de forma segura.
-
probaste con la api GetFileSize ?
-
Yo optaria por un metodo de compresion que me permita ver cuando termino y si se produjeron errores, me parece mas limpio y confiable.
-
como te decia en el Facebook una solucion es utilizar la funcion Shellandwait, esta funcion lo que hace es hacer la llamada y hasta que no termina el winrar, queda en el loop
(hay podes mostrar un progress indefinido)
ahora bien como dice cobein, si llegara a haber un error puede que no te enteres y quedarte si backup
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Sub ShellAndWait(ByVal program_name As String, ByVal window_style As VbAppWinStyle)
Dim process_id As Long
Dim process_handle As Long
Const SYNCHRONIZE As Long = &H100000
Const INFINITE As Long = &HFFFFFFFF
' Start the program.
On Error GoTo ShellError
process_id = Shell(program_name, window_style)
On Error GoTo 0
DoEvents
' Wait for the program to finish.
' Get the process handle.
process_handle = OpenProcess(SYNCHRONIZE, 0, process_id)
If process_handle <> 0 Then
WaitForSingleObject process_handle, INFINITE
CloseHandle process_handle
End If
Exit Sub
ShellError:
End Sub
-
Excelente!! voy a ver que aplicar esta solucion. Gracias y abrazos.