Autor Tema: Tamaño exacto de un archivo.  (Leído 1349 veces)

0 Usuarios y 1 Visitante están viendo este tema.

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Tamaño exacto de un archivo.
« 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...

Código: (VB) [Seleccionar]
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.
« última modificación: Septiembre 06, 2013, 12:36:39 am por YAcosta »
Me encuentras en YAcosta.com

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Tamaño exacto de un archivo.
« Respuesta #1 en: Septiembre 06, 2013, 01:02:08 am »
probaste con la api GetFileSize ?

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:Tamaño exacto de un archivo.
« Respuesta #2 en: Septiembre 06, 2013, 09:48:56 am »
Yo optaria por un metodo de compresion que me permita ver cuando termino y si se produjeron errores, me parece mas limpio y confiable.

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Tamaño exacto de un archivo.
« Respuesta #3 en: Septiembre 06, 2013, 03:31:59 pm »
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

Código: (vb) [Seleccionar]
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


YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Tamaño exacto de un archivo.
« Respuesta #4 en: Septiembre 06, 2013, 04:48:30 pm »
Excelente!! voy a ver que aplicar esta solucion. Gracias y abrazos.
Me encuentras en YAcosta.com