2012-04-06 24 views
7

Necesito descomprimir en zip algunos archivos en mi aplicación usando Shell32. En este momento, uso srcFolder.CopyHere(destFolder.Items()) para lograr esto. Sin embargo, mi próxima línea de código requiere el archivo ZIP recién creado. Pero dado que el método CopyHere es Async, ¿cómo puedo verificar cuándo terminó? Ahora uso un Thread.Sleep durante unos 500 ms, lo cual es suficiente para que mi computadora termine de crear el archivo ZIP, pero no es un buen código.Cómo verificar cuándo Shell32.Folder.CopyHere() está terminado

¿Alguna idea?

Más información/código se puede proporcionar si es necesario.

Respuesta

6

lo encontré, usado algo como esto:

srcFolder.CopyHere(destFolder.Items()) 


      While FileInUse(FILEPATH & "BudgetJaarOverzichtSMB.zip") 
       Thread.Sleep(100) 
      End While 

    Private Function FileInUse(ByVal FilePath As String) As Boolean 
     Try 
      FileOpen(1, FilePath, OpenMode.Input) 
      FileClose(1) 
      Return False ' File not in use 
     Catch ex As Exception 
      Return True  ' File in use 
     End Try 
    End Function 

En realidad, no es perfecto pero se perderá menos tiempo que con mi primer acercamiento.

+0

+1 tratado de encontrar algo, pero no encontraron nada. Solo una nota. Agregue una medida de seguridad para romper ese ciclo si su copia toma demasiado tiempo. (Por ejemplo, rutas de red no disponibles) – Steve

+0

Esta solución funciona en Windows 8 pero se dispara prematuramente en Windows 7. ¿Alguna idea? –

+0

Usando Excel VBA, necesitamos 1. Copie un archivo de texto al código postal 2. Obtenga la secuencia de bytes de la cremallera para un procesamiento posterior. 3. Eliminar archivos de texto y zip. Como el código nos da errores inusuales e irregulares (siempre relacionados con rutas de archivos/rutas de archivos zip), extrajimos el código para 1 y 3 en otro entorno de prueba y lo volvimos a analizar varias veces. Aquí implementamos la solución FileInUse, pero de alguna manera la función sigue devolviendo false y las eliminaciones no se ejecutan en absoluto. – sidnc86

8

Aquí es otra para esperar a terminar de copiar

'Wait until the File/Folder has finished writing to zip file... 
Do Until Shell.NameSpace(Filename).Items.Count = Shell.NameSpace(Input).Items.Count 
    System.Threading.Thread.Sleep(200) 
    System.Diagnostics.Debug.Print("Waiting...") 
Loop 
+0

Genius ..., debería ser la respuesta superior. De esta manera, probablemente sea mucho más eficiente, no bloquee las llamadas al kernel. – Motes

+0

Esto es bastante bueno. Sin embargo, es posible que tenga que ajustar para cualquier cantidad de elementos preexistentes en la carpeta. –

+0

Este enfoque a veces arroja errores. Hemos implementado esto en nuestro proyecto, pero en una de nuestras máquinas cliente esto genera el error 70 o el error 75. – sidnc86

Cuestiones relacionadas