进度条和文件复制问题?
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 中给出的示例,由于每个操作都是同步的,因此您将无法获得所需的内容。
编辑:被我上面的那个人殴打:)
【讨论】:
以上是关于进度条和文件复制问题?的主要内容,如果未能解决你的问题,请参考以下文章