2012-04-06 9 views
7

Ho bisogno di decomprimere en zip alcuni file nella mia applicazione usando Shell32. In questo momento, io uso srcFolder.CopyHere(destFolder.Items()) per raggiungere questo obiettivo. Tuttavia, la mia prossima riga di codice richiede il file ZIP appena creato. Ma dal momento che il metodo CopyHere è Async, come posso verificare quando è finito? In questo momento io uso un Thread.Sleep per circa 500 ms, che è abbastanza per il mio computer per finire di creare il file ZIP, ma non è un buon codice imo.Come controllare quando Shell32.Folder.CopyHere() è terminato

Qualche idea?

Ulteriori informazioni/codice possono essere forniti se necessario.

risposta

6

ho trovato, usato qualcosa di simile:

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 

Non proprio perfetto ma perderà meno tempo che con il mio primo approccio.

+0

+1 cercato di trovare qualcosa, ma trovato nulla. Solo una nota. Aggiungi qualche misura di sicurezza per interrompere quel loop se la tua copia impiega troppo tempo. (Ad esempio i percorsi di rete non disponibili) – Steve

+0

Questa soluzione funziona su Windows 8 ma si attiva prematuramente su Windows 7. Qualche idea? –

+0

Utilizzando Excel VBA, è necessario 1. Copiare un file di testo sul file zip 2. Ottenere il flusso di byte dello zip per un'ulteriore elaborazione. 3. Elimina testo e file zip. Poiché il codice ci dà errori insoliti e irregolari (sempre relativi ai percorsi di file/percorsi di file zip), abbiamo estratto il codice per 1 e 3 in un altro ambiente di test e lo abbiamo ripetuto più volte. Qui abbiamo implementato la soluzione FileInUse ma in qualche modo la funzione continua a restituire false e le eliminazioni non vengono eseguite affatto. – sidnc86

8

Ecco un altro uno per in attesa di finire la copia

'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 ..., dovrebbe essere la risposta migliore. In questo modo è probabilmente molto più efficiente, senza bloccare le chiamate al kernel. – Motes

+0

Questo è abbastanza buono. Tuttavia, potrebbe essere necessario regolare per qualsiasi numero di elementi preesistenti nella cartella. –

+0

L'approccio Thiss a volte genera errori. Lo abbiamo implementato nel nostro progetto ma in una delle nostre macchine client ciò solleva l'errore 70 o l'errore 75. – sidnc86

Problemi correlati