我认为我坚持使用错误的方法解决问题。我试图获得一个可靠的进度条,用于将文件复制到USB驱动器。我的问题是,通过我的方法,它将工作但不可靠显示必要的信息,因为文件创建事件将在文件完成写入之前触发(并且在目录复制的情况下,其多处理并将创建几乎所有文件马上但是会写得更远,特别是如果usb dirve很慢(usb 2.0)。以下是我的方法,但我确信必须有更好的方法来解决这个问题。
Public counterLocalFiles As String
Private Sub CopyUSB
fsw_USB = New IO.FileSystemWatcher(Path)
fsw_USB.IncludeSubdirectories = True
fsw_USB.EnableRaisingEvents = True
UpdateProgressBarMaximum2(CInt(counterLocalFiles))
counterLocalFiles = System.IO.Directory.GetFiles(SourcePath,
My.Computer.FileSystem.CopyDirectory(SourcePath, Path)"*.jpg*", SearchOption.AllDirectories).Length
End Sub
Private Sub fsw_USB_Created(sender As Object, e As FileSystemEventArgs) Handles fsw_USB.Created
Dim counterUSBFiles = IO.Directory.GetFiles(Path, "*.jpg", SearchOption.AllDirectories).Length
UpdateProgressBar2(CInt(counterUSBFiles))
UpdateLabelText2(CStr(counterUSBFiles) & " von " & CStr(counterLocalFiles))
End Sub
Private Sub UpdateProgressBarMaximum2(Maximum As Int32)
If ProgressBar2.InvokeRequired Then
ProgressBar2.Invoke(New Action(Of Integer)(AddressOf UpdateProgressBarMaximum2), Maximum)
Else
'We are on the UI thread so update the control.
ProgressBar2.Maximum = Maximum
End If
End Sub
Private Sub UpdateProgressBar2(Value As Int32)
If ProgressBar2.InvokeRequired Then
ProgressBar2.Invoke(New Action(Of Integer)(AddressOf UpdateProgressBar2), Value)
Else
'We are on the UI thread so update the control.
ProgressBar2.Value = Value
End If
End Sub
答案 0 :(得分:1)
我使用BackgroundWorker
和FileStream
创建了一个如何执行此操作的示例。代码比我在这里发布的更多...因为它是一个Visual Studio项目...所以我把它压缩了,你可以在这里下载:http://www.filedropper.com/copydirectoryvisualstudioexample
您可以运行它并选择“源”和“目标”文件夹。
主目录复制过程发生在bgwDirectoryCopy_DoWork
中,单个文件复制过程发生在copyFileWithProgress
只需修改您需要的...现在复制*.*