vb.net 如何对文件夹实现复制,并显示进度条,每复制一个文件还在richtextbox1中显示出来!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vb.net 如何对文件夹实现复制,并显示进度条,每复制一个文件还在richtextbox1中显示出来!相关的知识,希望对你有一定的参考价值。

参考技术A

利用线程,和计时器,Function GetFolderSize从网上借鉴的,不知道为什么IO类不支持不同分区移动,所以移动目录只能在相同分区,设计界面如图,代码如下

Imports System.Threading

Imports System.IO

Imports System.Text

Public Class Form1

    Dim SourceDir, DestDir As String

    Dim SourceLen As Integer

    '返回文件夹大小

    Private Function GetFolderSize(ByVal DirPath As String, Optional ByVal IncludeSubFolders As Boolean = True) As Long

        Dim lngDirSize As Long

        Dim objFileInfo As FileInfo

        Dim objDir As DirectoryInfo = New DirectoryInfo(DirPath)

        Dim objSubFolder As DirectoryInfo

        Try

            For Each objFileInfo In objDir.GetFiles()

                lngDirSize += objFileInfo.Length

            Next

            If IncludeSubFolders Then

                For Each objSubFolder In objDir.GetDirectories()

                    lngDirSize += GetFolderSize(objSubFolder.FullName)

                Next

            End If

        Catch

        End Try

        Return lngDirSize

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim T As New Thread(AddressOf DirMove)

        CheckForIllegalCrossThreadCalls = False

        SourceDir = TextBox1.Text

        DestDir = TextBox2.Text

        SourceLen = GetFolderSize(SourceDir)

        ProgressBar1.Value = 0

        Timer1.Interval = 100

        Timer1.Start()

        T.Start()

    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If Directory.Exists(DestDir) = False Then Exit Sub

        ProgressBar1.Value = Math.Round(GetFolderSize(DestDir) / SourceLen, 2) * 100

    End Sub

    Private Sub DirMove()

        Me.Text = "正在移动..."

        Directory.Move(SourceDir, DestDir)

        Me.Text = "移动完成!"

        ProgressBar1.Value = 100

        RichTextBox1.Text += DestDir & Environment.NewLine

    End Sub

End Class

本回答被提问者和网友采纳

使用进度条在python中复制文件

【中文标题】使用进度条在python中复制文件【英文标题】:copy files in python with progress bar 【发布时间】:2020-06-17 06:40:27 【问题描述】:

我有一个 python 脚本,可以复制选定位置中存在的文件夹和文件。 此任务完美运行,现在我想在复制时显示进度条。

我使用 tqdm 包在控制台中显示进度条,效果很好,但问题是它在每个文件上显示进度条并每次遍历所有现有文件.

示例:如果一个文件夹包含 128 个文件,它将像这样显示进度条 128 次

100%---------128/128 100%---------128/128

我想要的是为所有正在复制的文件显示进度条 1 次。

代码:

i=0
j=0
z=0
for dirpath, dirnames, files in os.walk(src):           
    print(f'Found directory: dirpath')
    if len(dirnames)==0 and len(files)==0:
        print("this directory is empty")
        pass

    for  file in files:
        full_file_name = os.path.join(dirpath, file)

        if os.path.join(dirpath) == src:
            if file.endswith("pdf"):
                if not os.path.exists(dst2):
                    os.mkdir(dst2)
                else:
                    print("the path alredy exist")

                 shutil.copy(full_file_name, dst2)
                i+=1

            elif file.endswith("docx") or file.endswith("doc"):

                 shutil.copy(full_file_name, dst)
                j+=1

        elif os.path.join(dirpath)== src2:
            if file.endswith("pdf"):
                numfile = len(files)

# i think the for loop must not be in this part.
                for z in enumerate(tqdm(numfile)): 
                    sleep(.1)

                 shutil.copy(full_file_name, dst3)
                z+=1

【问题讨论】:

【参考方案1】:

只需创建一个 tkinter 进度条小部件并将值从 for 循环传递给它。 进度完成后关闭窗口,而不是打印到控制台

Progressbar Image

使用 tkinter 更新进度条的代码示例:

from tkinter import *
from tkinter.ttk import Progressbar
import time
def progressbar(ProgressValue):  # Update Progress bar with a int/float/string Round 0-100 #
    ProgBar['value'] = ProgressValue; root.update()
root = Tk()
ProgBar = Progressbar(root, length=365, style='black.Horizontal.TProgressbar')
ProgBar.pack()

time.sleep(2)
progressbar('10') #Use this
time.sleep(2)
progressbar('50')
time.sleep(2)
progressbar('100')
root.mainloop()

【讨论】:

以及如何将进度条的更新与正在复制的文件联系起来? root.overrideredirect(True) 使用此行隐藏标题栏上的最小化最大化和关闭按钮 只除for循环计数(进度条(文件数/100)) 统计所有3种文件的总数,除以100,每次都添加到进度条中

以上是关于vb.net 如何对文件夹实现复制,并显示进度条,每复制一个文件还在richtextbox1中显示出来!的主要内容,如果未能解决你的问题,请参考以下文章

关于VB.NET进度条的实例

关于VB.NET进度条的实例

关于VB.NET中进度条使用问题

VB.NET显示程序的进度,该怎么做?

复制文件时,如何显示进度条(使用BlockRead函数读取数据,并插入application.ProcessMessages)

实现自定义背景色前景色显示进度的进度条