2009-08-19 86 views
0

使用VB 6進度條和文件複製問題?

在我的項目中,當我將文件從一個文件夾複製到另一個文件夾時,當時我想顯示進度條像複製...,一旦文件被複制進度條顯示的100 %已完成。

代碼。

「文件複製

Private Sub Copy_Click() 
Timer1.Enabled = True 
Dim abc As Integer 
Dim line As String 
abc = FreeFile 
Open App.Path & "\DatabasePath.TXT" For Input As #abc 
Input #abc, line 
databasetext = line 
Dim fs As New FileSystemObject, f As File 
Set f = fs.GetFile(databasetext) 
f.Copy App.Path & "\" 
Set fs = Nothing 
Close #abc 
End Sub 

Private Sub Timer1_Timer() 
ProgressBar1.Min = 0 
ProgressBar1.Max = 100 
ProgressBar1.Value = ProgressBar1.Value + 1 
If ProgressBar1.Value = ProgressBar1.Max Then 
Timer1.Enabled = False 
End If 
End Sub 

上面的代碼工作,但是當我點擊複製按鈕,Progressbar1不顯示,一旦文件被複制到另一個文件夾。然後只有progressbar1正在說明。

兩者都不會同時工作。

並且一旦文件被複制,那麼進度條應該顯示100%。現在它不能正確顯示,仍然文件正在複製,進度條顯示爲100%

任何人都可以幫助解決問題。

需要VB 6代碼幫助。

+0

仍然無法正常工作。請,它怎樣才能同時工作。 – Gopal 2009-08-19 13:30:53

回答

4

如果標準複製函數阻止定時器觸發,那麼您可以做的最好的事情是編寫自己的副本,它一次讀取源文件幾千字節,並將其寫入目標文件。

在每次讀取和寫入操作之間,您需要更新進度條並(可能)調用DoEvents以確保重新繪製。

此外,您的計時器代碼沒有意義。如果不參考實際取得的進展情況,每次都會隨意增加進度。您最好將進度條傳遞給您的複製函數,以便隨時更新它。

像這樣的事情會做到這一點:

Private Sub Copy_Click() 
    Dim abc As Integer 
    Dim line As String 
    abc = FreeFile 
    Open App.Path & "\DatabasePath.TXT" For Input As #abc 
    Input #abc, line 
    copyFile line, App.Path & "\" & line, ProgressBar1 
    Close #abc 
End Sub 



Sub copyFile(inFile As String, outFile As String, ByRef pg As ProgressBar) 

    Close 

    Const chunkSize = 1024 
    Dim b() As Byte 

    fhIn = FreeFile 

    Open inFile For Binary Access Read As #fhIn 

    fhOut = FreeFile 

    Open outFile For Binary Access Write As #fhOut 

    toCopy = LOF(fhIn) 'gets the size of the file 
    fileSize = toCopy 

    pb.Min = 0 
    pb.Max = toCopy 




    While toCopy > 0 
     If toCopy > chunkSize Then 
      ReDim b(1 To chunkSize) 
      toCopy = toCopy - chunkSize 
     Else 
      ReDim b(1 To toCopy) 
      toCopy = 0 
     End If 

     Get #fhIn, , b 
     Put #fhOut, , b 

     pg.Value = fileSize - toCopy 
     DoEvents 
    Wend 
    Close #fhIn 
    Close #fhOut 
End Sub 
+0

在生產中不要使用#1和#2,因爲您在原始功能中使用FreeFile :) – 2009-08-19 13:54:12

+0

@Gareth。它顯示錯誤在這行像不良文件名 - 打開inFile對於二進制訪問讀爲#1,打開outFile對於二進制訪問寫爲#2,我改爲#abc,它顯示相同的錯誤。 – Gopal 2009-08-19 14:06:21

+0

@Gareth。它顯示文件已經打開錯誤。 – Gopal 2009-08-19 14:12:28

0

要使進度條正常工作,必須使用定期循環內聯更新,或者在單獨的線程中運行。

+0

@Autocracy。 VB 6新手,如何使用週期循環? – Gopal 2009-08-19 13:02:34

+0

那麼,一個週期性的循環會像(複製文件的一部分,更新欄,重複,直到完成)。我不在VB中工作(任何事情),所以我給了一個語言不可知的答案。你會發現不同語言的線程不盡相同,但是這個問題在它所需的東西中是普遍的。請參閱http://www.la-solutions.co.uk/content/MVBA/MVBA-ProgressBar.htm和http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=26900&lngWId = 1 – 2009-08-19 15:43:29

0

在老同學VB6的副本是阻塞命令。所以即使DoEvents也會得到相同的結果(文件將被複制,然後進度條會出現)。如果您通過緩慢的介質複製大文件,並且需要能夠顯示進度,那麼您應該創建目標文件並以循環方式在塊中移動字節,在該循環中您可以更新進度欄。可悲的是,在OP中給出的例子中,由於每個操作都是同步的,因此您不會收到您正在查找的內容。

編輯:被我上面的傢伙毆打:)