2012-04-06 32 views
7

Tôi cần phải giải nén vi một số tệp trong ứng dụng của tôi bằng Shell32. Ngay bây giờ, tôi sử dụng srcFolder.CopyHere(destFolder.Items()) để đạt được điều này. Tuy nhiên, dòng mã tiếp theo của tôi yêu cầu tệp ZIP mới được tạo. Nhưng vì phương pháp CopyHere là Không đồng bộ, làm thế nào tôi có thể kiểm tra khi nó kết thúc? Ngay bây giờ tôi sử dụng một Thread.Sleep cho khoảng 500 ms đó là đủ cho máy tính của tôi để hoàn thành việc tạo tập tin ZIP, nhưng nó không phải là mã imo tốt.Cách kiểm tra khi nào Shell32.Folder.CopyHere() kết thúc

Bất kỳ ý tưởng nào?

Thông tin thêm/mã có thể được cung cấp nếu cần.

Trả lời

6

Tôi tìm thấy nó, sử dụng một cái gì đó như thế này:

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 

Không thực sự hoàn hảo nhưng sẽ mất ít thời gian hơn so với cách tiếp cận đầu tiên của tôi.

+0

+1 Cố gắng để tìm một cái gì đó, nhưng không tìm thấy bất cứ điều gì. Chỉ cần một lưu ý. Thêm một số biện pháp an toàn để phá vỡ vòng lặp đó nếu bản sao của bạn mất quá nhiều thời gian. (Ví dụ: đường dẫn mạng không khả dụng) – Steve

+0

Giải pháp này hoạt động trên Windows 8 nhưng sẽ phát sinh sớm trên Windows 7. Mọi suy nghĩ? –

+0

Sử dụng Excel VBA, chúng tôi cần 1. Sao chép tệp văn bản thành zip 2. Nhận luồng byte của zip để xử lý tiếp. 3. Xóa các tập tin văn bản và zip. Khi mã cho chúng ta lỗi bất thường và không thường xuyên (luôn liên quan đến đường dẫn tệp/đường dẫn tệp), chúng tôi trích xuất mã 1 và 3 vào một môi trường thử nghiệm khác và đọc lại nhiều lần. Ở đây chúng tôi đã thực hiện giải pháp FileInUse nhưng bằng cách nào đó hàm vẫn giữ nguyên về việc trả về false và các lệnh xóa không thực thi. – sidnc86

8

Dưới đây là một số khác đã chờ đợi để kết thúc việc sao chép

'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 ..., phải là câu trả lời hàng đầu. Bằng cách này có lẽ hiệu quả hơn nhiều, không chặn các cuộc gọi hạt nhân. – Motes

+0

Điều này khá tốt. Tuy nhiên, bạn có thể phải điều chỉnh cho bất kỳ số lượng các mục đã tồn tại từ trước trong thư mục. –

+0

Cách tiếp cận này đôi khi vẫn ném lỗi. Chúng tôi đã thực hiện điều này trong dự án của chúng tôi nhưng trong một trong các máy khách của chúng tôi, điều này làm tăng Lỗi 70 hoặc Lỗi 75. – sidnc86

Các vấn đề liên quan