2009-08-19 90 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中给出的例子中,由于每个操作都是同步的,因此您不会收到您正在查找的内容。

编辑:被我上面的家伙殴打:)