Moin moin
Ich habe mit dieser Class / Function beim umbenennen einige "Sporadische" Fehler.
Je nach Anzahl der Dateien in einem Verzeichnis bekomme ich die Meldung:
Die Anzahl der Dateien wo dieser Fehler auftritt ist nicht fest, mal sind es 2 mal 4 usw... Ich habe dann versucht es mit eine kleinen "Wartezeit" bzgl der Task zu kompensieren, um zu testen ob es da Probleme gibt. Allerdings funktioniert das nur sehr begrenzt und so denke ich nicht die beste Lösung ist.
Bei
Spoiler anzeigen
Ich habe mit dieser Class / Function beim umbenennen einige "Sporadische" Fehler.
Je nach Anzahl der Dateien in einem Verzeichnis bekomme ich die Meldung:
Datei kann nicht erstellt werden, wenn sie schon vorhanden ist.
Die Anzahl der Dateien wo dieser Fehler auftritt ist nicht fest, mal sind es 2 mal 4 usw... Ich habe dann versucht es mit eine kleinen "Wartezeit" bzgl der Task zu kompensieren, um zu testen ob es da Probleme gibt. Allerdings funktioniert das nur sehr begrenzt und so denke ich nicht die beste Lösung ist.
Bei
Await Task.Delay(100)
passt es z.B. wenn in dem Verzeichnis nicht mehr als 200 Dateien sind. In einem anderen Testverzeichnis mit 1500 Dateien, passt ein Wert von 550 schon nicht mehr.
VB.NET-Quellcode
-
- Public Class FileRenamer
- Private renamedFilesField As New List(Of FileInfo)()
- Public Property RenamedFiles As List(Of FileInfo)
- Get
- Return renamedFilesField
- End Get
- Private Set(ByVal value As List(Of FileInfo))
- renamedFilesField = value
- End Set
- End Property
- Public Property NewFileName As String
- Public Property RenamedFileName As String
- Public Property SuffixCounter As Integer = 0
- Public Property SuffixStartValue As Integer = 0
- Public Property SuffixLetter As String
- Public Property CountRenamedFiles As Integer
- Public Property DateofChange As Boolean
- Public Event ErrorOccurred(ByVal errorMessage As String)
- Public Event RenamedFileCountUpdated(ByVal count As Integer)
- Public Event RenamedFilesUpdated(ByVal files As List(Of FileInfo))
- Public ReadOnly Property RenamedFileInfo As List(Of FileInfo)
- Get
- Return renamedFilesField
- End Get
- End Property
- Public Async Function RenameFiles(ByVal selectedDirectory As String, ByVal files As List(Of String)) As Task
- Debug.WriteLine(selectedDirectory)
- RenamedFiles.Clear()
- CountRenamedFiles = 0
- Dim tasks As List(Of Task) = files.Select(Function(file) Task.Run(Function() RenameFileAsync(selectedDirectory, file))).ToList()
- Await Task.WhenAll(tasks)
- RaiseEvent RenamedFileCountUpdated(CountRenamedFiles)
- RaiseEvent RenamedFilesUpdated(RenamedFiles)
- End Function
- Private Async Function RenameFileAsync(ByVal selectedDirectory As String, ByVal file As String) As Task
- Dim extension As String = Path.GetExtension(file)
- Dim oldName As String = Path.Combine(selectedDirectory, file)
- Dim renamedFileName As String = Path.Combine(selectedDirectory, NewFileName & "_" & GenerateNewSuffix() & extension.ToLower())
- Dim fileExists As Boolean = System.IO.File.Exists(renamedFileName)
- While fileExists
- CountRenamedFiles += 1
- renamedFileName = Path.Combine(selectedDirectory, NewFileName & "_" & GenerateNewSuffix() & extension.ToLower())
- fileExists = System.IO.File.Exists(renamedFileName)
- Await Task.Delay(100) ' Kurze Wartezeit zum Testen!!
- End While
- Try
- Dim fileInfo As New FileInfo(oldName)
- If DateofChange Then
- fileInfo.LastWriteTime = DateTime.Now
- End If
- Await Task.Run(Sub()
- Try
- fileInfo.MoveTo(renamedFileName)
- RenamedFiles.Add(fileInfo)
- CountRenamedFiles += 1
- Catch moveException As Exception
- DebugWriteLine("Fehler beim Umbenennen der Datei: " & file & ". Fehler: " & moveException.Message)
- ' RaiseEvent ErrorOccurred("Fehler beim Umbenennen der Datei: " & file & ". Fehler: " & moveException.Message)
- End Try
- End Sub)
- Catch ex As Exception
- DebugWriteLine("Fehler beim Umbenennen der Datei: " & file & ". Fehler: " & ex.Message)
- ' RaiseEvent ErrorOccurred("Fehler beim Umbenennen der Datei: " & file & ". Fehler: " & ex.Message)
- End Try
- End Function
- Private Function GenerateNewSuffix() As String
- Dim suffix As String = ""
- If Not String.IsNullOrEmpty(SuffixLetter) Then
- suffix = SuffixLetter & "_"
- End If
- Dim counterString As String = SuffixCounter.ToString().PadLeft(4, "0"c)
- suffix &= SuffixStartValue.ToString() & SuffixCounter.ToString("D4")
- SuffixCounter += 1
- Return suffix
- End Function
- End Class
Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen.