进度条和文件复制问题?

Posted

技术标签:

【中文标题】进度条和文件复制问题?【英文标题】:Progress Bar and File Copying Problem? 【发布时间】:2010-11-20 22:43:05 【问题描述】:

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

【问题讨论】:

仍然无法正常工作。请问,它如何同时工作。 【参考方案1】:

如果标准复制功能阻止计时器触发,那么您可以做的最好的事情是编写自己的副本,该副本一次读取数千字节的源文件并将其写入目标文件。

在每次读取和写入操作之间,您需要更新进度条并(可能)调用 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 和 #2,使用 FreeFile,就像在原始函数中一样 :) @Gareth。它在这一行显示错误,如 Bad filename - Open inFile For Binary Access Read As #1,Open outFile For Binary Access Write As #2,我更改为 #abc,它显示相同的错误。 那是 #1/#2 咬你的东西。用现在编辑的代码试试吧。 @Gareth。它在“Open outFile For Binary Access Write As #fhOut”这一行显示“错误的文件名或编号”之类的错误 你传递给 inFile 和 outFile 什么?【参考方案2】:

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

【讨论】:

@Autocracy。 VB 6 新手,如何使用 Periodic 循环? 嗯,一个周期性的循环会像(复制文件的一部分,更新栏,重复直到完成)。我不在 VB(任何东西)中工作,所以我给出了一个与语言无关的答案。您会发现线程在不同语言之间有所不同,但这个问题在它所需要的方面是普遍存在的。见la-solutions.co.uk/content/MVBA/MVBA-ProgressBar.htm 和planet-source-code.com/vb/scripts/…【参考方案3】:

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

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

【讨论】:

以上是关于进度条和文件复制问题?的主要内容,如果未能解决你的问题,请参考以下文章

复制文件时显示进度百分比

快速文件复制与进度

无法获得文件复制进度

.net网站的文件上传读取进度条和断点下载

Python 给下载文件显示进度条和下载时间

前端上传文件实时显示进度条和上传速度的工作原理是怎样的?