2012-04-06 11 views
7

मुझे Shell32 का उपयोग करके मेरे एप्लिकेशन में कुछ फ़ाइलों को एन ज़िप करने की आवश्यकता है। अभी, मैं इसे प्राप्त करने के लिए srcFolder.CopyHere(destFolder.Items()) का उपयोग करता हूं। हालांकि, कोड की मेरी अगली पंक्ति में नव निर्मित ज़िप-फ़ाइल की आवश्यकता है। लेकिन चूंकि CopyHere विधि Async है, तो मैं इसे कब समाप्त कर सकता हूं? अभी मैं लगभग 500 एमएस के लिए Thread.Sleep का उपयोग करता हूं जो कि मेरे कंप्यूटर के लिए ज़िप फ़ाइल बनाने के लिए पर्याप्त है, लेकिन यह अच्छा कोड आईएमओ नहीं है।कैसे जांचें जब Shell32.Folder.CopyHere() समाप्त हो गया है

कोई विचार?

यदि आवश्यक हो तो अधिक जानकारी/कोड प्रदान किया जा सकता है।

उत्तर

6

मुझे मिल गया, कुछ इस तरह इस्तेमाल किया:

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 

नहीं वास्तव में सही है, लेकिन मेरा पहला दृष्टिकोण के साथ कम से कम समय खो देंगे।

+0

+1 कुछ को खोजने के लिए कोशिश की समाप्त करने के लिए इंतजार कर के लिए एक और एक है, लेकिन कुछ भी नहीं मिला। सिर्फ एक नोट। यदि आपकी प्रतिलिपि बहुत अधिक समय लेती है तो उस लूप को तोड़ने के लिए कुछ सुरक्षा उपाय जोड़ें। (उदाहरण के लिए अनुपलब्ध नेटवर्क पथ) – Steve

+0

यह समाधान विंडोज 8 पर काम करता है लेकिन विंडोज 7 पर समय से पहले आग लगती है। कोई विचार? –

+0

एक्सेल वीबीए का उपयोग करके, हमें की आवश्यकता है 1. ज़िप करने के लिए एक टेक्स्ट फ़ाइल कॉपी करें 2. आगे की प्रक्रिया के लिए ज़िप की बाइट स्ट्रीम प्राप्त करें। 3. टेक्स्ट और ज़िप फ़ाइलों को हटाएं। चूंकि कोड हमें असामान्य और अनियमित त्रुटियां दे रहा है (हमेशा फ़ाइल पथ/ज़िप फ़ाइल पथ से संबंधित), हमने 1 और 3 के लिए कोड को दूसरे परीक्षण वातावरण में निकाला और इसे कई बार फिर से चलाया। यहां हमने FileInUse समाधान लागू किया है लेकिन किसी भी तरह से फ़ंक्शन झूठी वापसी पर रहता है और हटाए गए निष्पादन निष्पादित नहीं होते हैं। – sidnc86

8

यहाँ कॉपी करने

'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

प्रतिभा ..., शीर्ष जवाब होना चाहिए। इस तरह शायद अधिक कुशल, कोई अवरुद्ध कर्नेल कॉल नहीं है। – Motes

+0

यह बहुत अच्छा है। हालांकि, आपको फ़ोल्डर में किसी भी पूर्व-मौजूदा आइटम के लिए समायोजित करना पड़ सकता है। –

+0

यह दृष्टिकोण कभी-कभी त्रुटियों को फेंकता है। हमने इसे हमारी परियोजना में कार्यान्वित किया है, लेकिन हमारी क्लाइंट मशीनों में से एक में यह त्रुटि 70 या त्रुटि 75 उठाता है। – sidnc86

संबंधित मुद्दे