【问题标题】:Copy directories and files with ProgressBar使用 ProgressBar 复制目录和文件
【发布时间】:2018-10-06 06:07:00
【问题描述】:

尝试创建控制台应用程序以将目录从源复制到目标,而在复制文件时进度条不执行任何操作...

My.Computer.FileSystem.CopyDirectory(source, destination)

For i = 1 To 100
    Console.Write(String.Format("Copy progress: {0}%" & vbCr, i))
    Threading.Thread.Sleep(100)
Next

或者 ProgressBar 在整个复制过程中都显示“复制进度 1%”...

For i = 1 To 100
    Console.Write(String.Format("Copy progress: {0}%" & vbCr, i))
    My.Computer.FileSystem.CopyDirectory(source, destination)
    Threading.Thread.Sleep(100)
Next

想知道我做错了什么,因为我显然将 My.Computer 行放在了错误的位置!

【问题讨论】:

  • 您必须一次复制一个文件,并在每个复制后增加进度。 CopyDirectory 方法在将控制权传递给下一条指令之前完成了这一切,因此它不适合此目的。
  • @AndrewMorton 感谢您的回复,除了 CopyDirectory 之外,还有其他更好的方法吗?
  • 获得带有Directory.GetFiles Method 的文件列表后,您可以使用File.Copy Method 复制每个文件。您可能会发现 Path.Combine Method 对于将部分路径可靠地组合在一起很有用。
  • @AndrewMorton 它说目标是一个目录而不是一个文件。
  • 你必须告诉它目标文件的完整路径,包括文件名。

标签: vb.net progress-bar console-application


【解决方案1】:

一个简单的解决方案,使用LinqSelect复制DirectoryInfo.GetFiles()返回的文件列表

向示例方法传递一个源目录数组和一个目标目录。
进度 (0-100%) 打印到输出窗口,ProgressBar 提供每个源路径的复制状态的视觉反馈。

此方法将返回所有复制文件的列表。

Dim sourcePath As String() = New String() {"[SourcePath1]", "[SourcePath2]", "[SourcePath3]"}
Dim destinationPath As String = "[DestinationPath]"
Dim filesCopied As List(Of String) = CopyDirectoryWithProgress(sourcePath, destinationPath)
Console.ReadLine()

Private Function CopyDirectoryWithProgress(sourcePath As String(), destPath As String) As List(Of String)

    Dim allFilesCopied As List(Of String) = New List(Of String)
    Dim progressBarPassSymbol As Char = ChrW(&H25A0)
    Dim progressBarEmptySymbol As String = New String(ChrW(&H2014), 30)

    For Each sPath As String In sourcePath
        Dim fileInfo As New DirectoryInfo(sPath).GetFiles()
        Dim numberOfFiles As Integer = fileInfo.Length - 1
        Dim progressBarPass As Double = (30 / numberOfFiles)
        Dim increment As Double = 100 / numberOfFiles
        Directory.CreateDirectory(destPath)

        Console.CursorLeft = 0
        Console.Write("Copy progress: ")
        Console.CursorLeft = 20
        Console.Write(progressBarEmptySymbol)

        allFilesCopied.AddRange(fileInfo.
            Select(Function(f, i)
               File.Copy(Path.Combine(sPath, f.Name), Path.Combine(destPath, f.Name), True)
               Console.CursorLeft = 15
               Console.Write("{0:g}% " &
                   New String(progressBarPassSymbol, CInt((i + 1) * progressBarPass)),
                   CInt((i + 1) * increment))

               Return f.FullName
           End Function))
        Console.WriteLine()
    Next
    Return allFilesCopied
End Function

有关使用更快的文件枚举器执行此任务的有趣方法,请参阅此 CodeProject 文章:A Faster Directory Enumerator

【讨论】:

  • 不,它有效!现在我正在尝试将SourcePath 制作成一个数组来保存3个不同的路径。即Dim SourcePath() As String = {"C:\Users\username\Desktop", "D:\", "E:\"}
  • 哦,是的,拜托!
  • 我试过运行它,它只是进入中断模式?
  • 我怎样才能给你发私信?
  • DM = 私信
【解决方案2】:

您可以在使用 UIOption.AllDialogs 进行复制时调用 Windows 内置进度条:

My.Computer.FileSystem.CopyFile("C:\text.txt", "C:\my_folder\text.txt", FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多