1

使用 VB 6

在我的项目中,当我将文件从一个文件夹复制到另一个文件夹时,我想像复制一样显示进度条......,一旦文件被复制,进度条就会显示 100 % Completed。

代码。

'文件复制

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

4

3 回答 3

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
于 2009-08-19T13:13:15.527 回答
0

要使进度条起作用,它要么必须通过周期性循环内联更新,要么在单独的线程中运行。

于 2009-08-19T12:57:40.420 回答
0

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

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

于 2009-08-19T13:13:50.880 回答