Hi,
ich habe ein kleines Programm geschrieben, dass bei allen Dateien mit Extension ".png" die Endung weghaut.
Soweit sogut. Da es sich aber öfters um 10.000 - 20.000 Dateien handelt, wollte ich eine Progressbar einbauen, die den Fortschritt anzeigt.
Zuerst zähle ich in einer extra Schleife alle Dateien (GetTotalCount). Die Sub SearchAndRename durchsucht rekursiv alle Ordner und bennent Dateien um.
Ich "raise" nach jedem Umbenennen ein Event, welches den Wert der Progressbar und eine Textbox ändert.
Wenn die Sub SearchAndRename fertig ist, dann springt die Progressbar auf 100%. Das Problem besteht auch, wenn ich statt dem Event die Sub direkt ausführe.
Wie bekomm ich den Übergang hin? Brauche ich dafür Multithreading?
Spoiler anzeigen
mfg Markus
ich habe ein kleines Programm geschrieben, dass bei allen Dateien mit Extension ".png" die Endung weghaut.
Soweit sogut. Da es sich aber öfters um 10.000 - 20.000 Dateien handelt, wollte ich eine Progressbar einbauen, die den Fortschritt anzeigt.
Zuerst zähle ich in einer extra Schleife alle Dateien (GetTotalCount). Die Sub SearchAndRename durchsucht rekursiv alle Ordner und bennent Dateien um.
Ich "raise" nach jedem Umbenennen ein Event, welches den Wert der Progressbar und eine Textbox ändert.
Wenn die Sub SearchAndRename fertig ist, dann springt die Progressbar auf 100%. Das Problem besteht auch, wenn ich statt dem Event die Sub direkt ausführe.
Wie bekomm ich den Übergang hin? Brauche ich dafür Multithreading?
VB.NET-Quellcode
- Imports System.IO
- Imports System.Text.RegularExpressions
- Imports System.Threading
- Public Class Form1
- Private Event RefreshUI()
- Private Property index As Int64 = 0
- Private Property total As Int64 = 0
- Private Sub GetTotalCount(path As String, lastdir As Boolean)
- Dim dirinfo As New DirectoryInfo(path)
- total += dirinfo.GetFiles("*.png").Length
- Dim dirfound As Boolean = False
- Dim Dirs() As DirectoryInfo = dirinfo.GetDirectories.ToArray
- dirfound = Dirs.Length > 0
- For i = 0 To Dirs.Length - 1
- GetTotalCount(Dirs(i).FullName, i = Dirs.Length - 1 And lastdir)
- Next
- If lastdir And Not dirfound Then
- tbTotal.Text = total.ToString
- pbRenamed.Minimum = 0
- pbRenamed.Maximum = CInt(total)
- pbRenamed.Value = 0
- End If
- End Sub
- Private Sub SearchAndRename(path As String, lastdir As Boolean)
- Dim dirinfo As New DirectoryInfo(path)
- For Each File As FileInfo In dirinfo.GetFiles("*.png")
- Dim NewFullPath As String = Regex.Replace(File.FullName, "\.png$", "")
- File.MoveTo(NewFullPath) 'Benennt eine Datei um
- RaiseEvent RefreshUI()
- Next
- Dim dirfound As Boolean = False
- Dim Dirs() As DirectoryInfo = dirinfo.GetDirectories.ToArray
- For i = 0 To Dirs.Length - 1
- dirfound = True
- SearchAndRename(Dirs(i).FullName, i = Dirs.Length - 1 And lastdir)
- Next
- If lastdir And Not dirfound Then
- System.Media.SystemSounds.Asterisk.Play()
- total = 0
- index = 0
- End If
- End Sub
- Private Sub RefreshMe() Handles Me.RefreshUI
- index += 1
- tbIndex.Text = index.ToString
- pbRenamed.Value = CInt(total)
- End Sub
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btnRename.Click
- index = 0
- total = 0
- tbIndex.Text = index.ToString
- tbTotal.Text = "Unbekannt"
- DirectCast(sender, Button).Enabled = False
- Dim sw As New Stopwatch
- sw.Start()
- GetTotalCount(Application.StartupPath, True) 'Zählt alle Dateien
- SearchAndRename(Application.StartupPath, True) 'Bennent alle Dateien um
- MsgBox(sw.ElapsedMilliseconds / 1000)
- DirectCast(sender, Button).Enabled = True
- End Sub
- End Class
mfg Markus