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中显示出来!的主要内容,如果未能解决你的问题,请参考以下文章
复制文件时,如何显示进度条(使用BlockRead函数读取数据,并插入application.ProcessMessages)