进度条和文件复制问题?

时间:2009-08-19 12:51:43

标签: vb6 copy progress-bar

使用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代码帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

要使进度条起作用,必须使用定期循环内联更新,或者在单独的线程中运行。

答案 2 :(得分:0)

旧学校VB6中的副本是一个阻止命令。因此,即使DoEvents也会给出相同的结果(文件将被复制,然后进度条将显示)。如果您要通过慢速介质复制大文件并且需要能够显示进度,那么您应该创建目标文件并在循环中以块的形式移动字节,在该循环中您可以更新进度条。遗憾的是,对于OP中给出的示例,由于每个操作都是同步的,因此您无法获得所需的内容。

编辑:被我上面的那个人殴打:)