Vb6 进度条和文件复制问题?

Vb6 进度条和文件复制问题?,vb6,copy,progress-bar,Vb6,Copy,Progress Bar,使用vb6 在我的项目中,当我将文件从一个文件夹复制到另一个文件夹时,当我想像复制一样显示进度条时…,一旦文件被复制,进度条显示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,

使用vb6

在我的项目中,当我将文件从一个文件夹复制到另一个文件夹时,当我想像复制一样显示进度条时…,一旦文件被复制,进度条显示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代码帮助。

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

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

如果标准复制函数阻止计时器启动,那么最好编写自己的副本,一次读取几千字节的源文件,然后将其写入目标文件

在每次读写操作之间,您需要更新进度条,并(可能)调用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

如果标准复制函数阻止计时器启动,那么最好的方法是编写自己的副本,一次读取几千字节的源文件,然后将其写入目标文件

在每次读写操作之间,您需要更新进度条,并(可能)调用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

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


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

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


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

@独裁。VB6新手,如何使用周期循环?周期循环的工作原理如下(复制部分文件,更新栏,重复直到完成)。我不在VB中工作,所以我给出了一个语言不可知的答案。您会发现线程在不同语言之间是不同的,但这个问题在它所需要的方面是普遍存在的。参见和@Autocracy。VB6新手,如何使用周期循环?周期循环的工作原理如下(复制部分文件,更新栏,重复直到完成)。我不在VB中工作,所以我给出了一个语言不可知的答案。您会发现线程在不同语言之间是不同的,但这个问题在它所需要的方面是普遍存在的。看到了,还是不工作。拜托,它怎么能同时工作?还是不工作。请问,它是如何同时工作的。在生产中,不要使用#1和#2,使用FreeFile,就像在原来的函数中一样:)@Gareth。这一行显示错误,比如坏文件名-打开infle以二进制访问方式读取为#1,打开outFile以二进制访问方式写入为#2,我改为#abc,它显示相同的错误。这是#1/#2咬你的东西。用现在编辑的代码试试。@Gareth。在“打开输出文件进行二进制访问写入为#fhOut”这一行上显示错误,如“文件名或编号错误”。您将向填充文件和输出文件传递什么?在生产中,不要使用#1和#2,像在原始函数中一样使用FreeFile:)@Gareth。这一行显示错误,比如坏文件名-打开infle以二进制访问方式读取为#1,打开outFile以二进制访问方式写入为#2,我改为#abc,它显示相同的错误。这是#1/#2咬你的东西。用现在编辑的代码试试。@Gareth。在“打开输出文件进行二进制访问写入为#fhOut”这一行上显示错误,如“文件名或编号错误”,您将向填充文件和输出文件传递什么?