我正在使用Visual Studio 2010并在Visual Basic中进行编码。
我必须在复制目录时显示进度条。 我以前从未使用过进度条,也不知道从哪里开始。 这是我目前的代码。
If My.Computer.FileSystem.DirectoryExists(filePath & "IETMS\" & installFile) Then
frmWait.Show()
My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS", True)
ListView1.Items.Clear()
testReload()
frmWait.Close()
Else
My.Computer.FileSystem.CreateDirectory(filePath & "IETMS\" & installFile)
frmWait.Show()
My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS", True)
ListView1.Items.Clear()
testReload()
frmWait.Close()
End If
我假设我需要计算源文件夹的大小,然后监视目标文件夹大小并将进度条最大值设置为源文件夹大小,并将进度条的值设置为目标大小,但我我不知道该怎么做。
答案 0 :(得分:3)
您可以计算源目录中的文件,然后经常计算目标目录中的文件。要计算所有子目录中的文件,可以使用递归子:
Private Sub CountFiles(InFolder As String, ByRef Result As Integer)
Result += IO.Directory.GetFiles(InFolder).Count
For Each f As String In IO.Directory.GetDirectories(InFolder)
CountFiles(f, Result)
Next
End Sub
要使用此功能
Dim FileCount as Integer = 0
CountFiles("C:\test", FileCount)
Messagebox.Show(FileCount.ToString)
将进度条设置为百分比值,如pbProgress.Value = CInt(DestCount/SourceCount * 100)
。
编辑:跟进您的问题:您应该使用例如后台工作者,任务或线程来执行复制,然后更新计时器中的进度条。 例如,您可以创建一个执行复制的子,然后在新任务中启动子: Private WithEvents tmrUpdatePBG作为计时器 Private Sub StartCopy(SourceFolder As String,DestFolder As String) '复制副本 CopyComplete() 结束子 Private Sub CopyComplete() tmrUpdatePBG.Stop() 结束子
[...]
'Whereever you start the copy process
Dim ct As New Task(Sub() StartCopy("C:\source", "C:\dest"))
ct.Start()
tmrUpdatePBG = New Timer
tmrUpdatePBG.Interval = 1000
tmrUpdatePBG.Start()
tmrUpdatePGB
将成为计时器。在tick事件中更新进度条。它在复制过程开始时启动,在过程完成时停止。
答案 1 :(得分:0)
我最终计算了源文件夹中的文件并将进度条max设置为该数字。然后在计时器内部计算目标文件夹中的文件,并将进度条值设置为该数字。然后在复制完成后关闭我使用进度条创建的窗口。
我的进度条也有问题(没有响应)所以我将CopyDirectory放在BackgroundWorker中。
Private Sub tmrWait_Tick(sender As System.Object, e As System.EventArgs) Handles tmrWait.Tick
Dim srcFile As String = strFileName & "\" & installFile
Dim srcDir As New System.IO.DirectoryInfo(srcFile)
Dim srcFolders, srcFiles As Integer
srcFolders = srcDir.GetDirectories.GetUpperBound(0) + 1
srcFiles = srcDir.GetFiles.GetUpperBound(0) + 1
pbInstall.Maximum = srcFolders.ToString()
Dim desFile As String = filePath & "IETMS\" & installFile & "\" & installFile
Dim desDir As New System.IO.DirectoryInfo(desFile)
Dim desFolders, desFiles As Integer
desFolders = desDir.GetDirectories.GetUpperBound(0) + 1
desFiles = desDir.GetFiles.GetUpperBound(0) + 1
pbInstall.Value = desFolders.ToString()
pbInstall.Refresh()
End Sub
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
System.Threading.Thread.Sleep(1000)
My.Computer.FileSystem.CopyDirectory(strFileName, filePath & "IETMS\" & installFile, True)
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
frmMain.ListView1.Items.Clear()
frmMain.testReload()
Me.Close()
End Sub
Private Sub frmWait_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
BackgroundWorker1.RunWorkerAsync()
End Sub