Hallo zusammen
Seit geraumer Zeit suche ich hier im Forum immer mal wieder wenn ich Probleme beim rumtüfteln in vb.NET habe...
Jetzt stehe ich vor einem Lustigen Problem.
Ich habe mit einen Freund eine Wette am laufen das ich so einen WoW P-Server Launcher nicht zusammen gebastelt bekomme womit ich aber so gut wie fertig bin.
Ich lasse zip-Dateien per WebClient Asynchron downloaden um eine "Progressbar" zu füllen und einen Status zu bekommen.
Nachdem alle Dateien gedownloaded wurden werden diese durch einen BackgroundWorker über die Ionic.zip.dll entpackt um auch dort einen Status zu erhalten und sollten im Anschluss eigentlich gelöscht werden...
Leider bricht das ganze an der Stelle ab und erzählt mir das die zip-Dateien von einen anderen Prozess genutzt werden...
Der Dwonload läuft über folgenden Code:
Spoiler anzeigen
Das Entpacken danach über diesen Code:
Spoiler anzeigen
Und das Löschen sollte dann über diesen Code laufen:
Timer1:
DeleteUnWanted():
Spoiler anzeigen
Tut mir bitte einen gefallen und Steinigt mich nicht für den Code ich bin leider nicht der beste Programmierer versuche aber mein Möglichstes...
Ich habe keine Ahnung warum die Dateien nicht gelöscht werden können... Ich hoffe ihr könnt mir helfen.
Ein dickes Danke schon einmal im vor raus!
EDIT://
Ich habe hier (für das Forum) alle Backslashs (Ich weiß nicht was die Mehrzahl ist O.o) verdoppelt da das Syntax highlighting sonst
einen Fehler ergibt im Code funktioniert das bislang aber Problemlos.
Habt ihr eine Ahnung was ich Falsch mache wo das ganze mir die zip-Dateien sperrt?
Ich denke das es an dem Thread des Backgroundworkers liegt bin mir aber nicht wirklich sicher zumal ich den (glaub ich) 3x den befehl zum schließen gebe um ganz sicher zu gehen...
Ich habe gerade auch einen Test mit zip-Dateien gemacht die insgesammt 30MB groß sind und da klappt das ganze problemlos... Wie kann das sein?
Ich Arbeite mit Visual Studio 2013 Ultimate das habe ich noch vergessen zu erwähnen.
Gruß
Panics
Seit geraumer Zeit suche ich hier im Forum immer mal wieder wenn ich Probleme beim rumtüfteln in vb.NET habe...
Jetzt stehe ich vor einem Lustigen Problem.
Ich habe mit einen Freund eine Wette am laufen das ich so einen WoW P-Server Launcher nicht zusammen gebastelt bekomme womit ich aber so gut wie fertig bin.
Ich lasse zip-Dateien per WebClient Asynchron downloaden um eine "Progressbar" zu füllen und einen Status zu bekommen.
Nachdem alle Dateien gedownloaded wurden werden diese durch einen BackgroundWorker über die Ionic.zip.dll entpackt um auch dort einen Status zu erhalten und sollten im Anschluss eigentlich gelöscht werden...
Leider bricht das ganze an der Stelle ab und erzählt mir das die zip-Dateien von einen anderen Prozess genutzt werden...
Der Dwonload läuft über folgenden Code:
VB.NET-Quellcode
- Private Sub w_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles w.DownloadFileCompleted
- sw.Stop()
- ProgBar.Value = 0
- ListBox2.Items.Clear()
- 'MessageBox.Show(e.ToString)
- Dim grade As New IO.DirectoryInfo(My.Settings.WoW_Pfad & "\\")
- Dim diar As IO.FileInfo() = grade.GetFiles()
- Dim dra As IO.FileInfo
- Dim Counter As Integer = 0
- For Each dra In diar
- ListBox2.Items.Add(dra)
- Next
- For i As Integer = 0 To ListBox1.Items.Count - 1
- If Len(Dir(My.Settings.WoW_Pfad & "\\" & ListBox1.Items.Item(i))) <> 0 Then
- Counter = Counter + 1
- If Counter = ListBox1.Items.Count Then
- BackgroundWorker1.RunWorkerAsync()
- TextBox1.Text = ""
- Label7.Text = "Status - Download - Abgeschlossen"
- ProgBar.Value = 100
- End If
- Else
- Schritt = Schritt + 1
- Counter = Counter + 1
- sw.Start()
- w.DownloadFileAsync(New Uri("http://**.**.**.**/downloads/WoW/3.3.5a/" & ListBox1.Items.Item(i)), My.Settings.WoW_Pfad & "\\" & ListBox1.Items.Item(i))
- TextBox1.Text = ListBox1.Items.Item(i)
- Exit For
- End If
- Next
- End Sub
- Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles w.DownloadProgressChanged
- sw.Stop()
- Speed = Math.Round((e.BytesReceived - zm) / 1024 / (sw.ElapsedMilliseconds / 1000))
- ProgBar.Value = e.ProgressPercentage
- Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
- Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
- Dim percentage As Double = bytesIn / totalBytes * 100
- Dim down As Integer = bytesIn / 1048576
- Dim total As Integer = totalBytes / 1048576
- DownStatus = Integer.Parse(Math.Truncate(percentage))
- Trigger = 475 / 100 * percentage
- Status = DownStatus
- Label7.Visible = True
- Progress.Width = Trigger
- Label7.Text = "Downloade - Datei: " & Schritt & " von " & Schritte & " - " & down.ToString("N0") & "MB" & "/" & total & "MB" & " - " & Status & "%" & " - Datei: " & TextBox1.Text
- zm = e.BytesReceived
- sw.Restart()
- End Sub
Das Entpacken danach über diesen Code:
VB.NET-Quellcode
- Private Property CurrentCount As Integer
- Private Property TotalCount As Integer = 1
- Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
- ProgBar.Value = e.ProgressPercentage
- Trigger = 475 / 100 * ProgBar.Value
- Progress.Width = Trigger
- Label7.Text = "Entpacke - Datei: " & Datei & " von " & DateienTotal & " - " & ProgBar.Value & "%"
- End Sub
- Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- Timer1.Start()
- BackgroundWorker1.CancelAsync()
- End Sub
- Private Function SearchAndAddToListWithFilter(ByVal path As String, ByVal filters As String(), ByVal searchSubFolders As Boolean) As List(Of IO.FileInfo)
- If Not IO.Directory.Exists(path) Then
- Throw New Exception("Path not found")
- End If
- Dim searchOptions As IO.SearchOption
- If searchSubFolders Then
- searchOptions = IO.SearchOption.AllDirectories
- Else
- searchOptions = IO.SearchOption.TopDirectoryOnly
- End If
- Return filters.SelectMany(Function(filter) New IO.DirectoryInfo(path).GetFiles(filter, searchOptions)).ToList
- End Function
- Private Delegate Sub SetStatusTextInvoker(ByVal Text As String)
- Private Sub SetStatusText(ByVal Text As String)
- If Me.InvokeRequired Then
- Me.Invoke(New SetStatusTextInvoker(AddressOf SetStatusText), Text)
- Else
- Label7.Text = Text
- End If
- End Sub
- Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- Dim TotalSize As Long
- Dim ZipToUnpack As String = My.Settings.WoW_Pfad & "\\" & ListBox3.Items.Item(ListBox3.Items.Count - 1).ToString
- Dim extractDir As String = My.Settings.WoW_Pfad & "\\"
- Try
- Using zip As ZipFile = ZipFile.Read(ZipToUnpack)
- AddHandler (zip.ExtractProgress), New EventHandler(Of ExtractProgressEventArgs)(AddressOf Zip_ExtractProgress)
- For Each Entry As ZipEntry In zip.Entries
- DateienTotal = DateienTotal + 1
- TotalSize += Entry.UncompressedSize
- Next
- For Each Entry As ZipEntry In zip.Entries
- Datei = Datei + 1
- Entry.Extract(extractDir, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently)
- Next
- End Using
- Catch EX As Exception
- MessageBox.Show(EX.Message)
- End Try
- End Sub
- Private Sub Zip_ExtractProgress(ByVal sender As Object, ByVal e As ExtractProgressEventArgs)
- If BackgroundWorker1.CancellationPending Then
- e.Cancel = True
- End If
- Select Case e.EventType
- Case ZipProgressEventType.Extracting_EntryBytesWritten
- Dim Entry As Integer
- Dim CurrentCount As Integer = Entry
- BackgroundWorker1.ReportProgress(CInt(Math.Truncate(100 * (e.BytesTransferred / e.TotalBytesToTransfer))))
- If _setCancel Then
- ' this Boolean would be set in a event handler for the cancel button
- e.Cancel = True
- End If
- End Select
- End Sub
Und das Löschen sollte dann über diesen Code laufen:
Timer1:
DeleteUnWanted():
VB.NET-Quellcode
- Private Sub DeleteUnWanted()
- BackgroundWorker1.CancelAsync()
- Progress.Width = 475
- Label7.Text = "Status - Entpacken: Abgeschlossen - WoW Fertig Installiert"
- _setCancel = True
- Dim FileToDelete As String
- If Len(Dir(My.Settings.WoW_Pfad & "\wow.exe")) <> 0 Then
- For i As Integer = 0 To ListBox3.Items.Count - 1
- FileToDelete = My.Settings.WoW_Pfad & "\\" & ListBox3.Items.Item(i)
- If System.IO.File.Exists(FileToDelete) = True Then
- System.IO.File.Delete(FileToDelete)
- End If
- Next
- End If
- Dim result As Integer = MessageBox.Show("Das Spiel wurde nun Erfolgreich gedownloaded und Installiert." _
- & vbNewLine & "Soll das Spiel nun gestartet werden?", "Soll World of Warcraft gestartet werden?", _
- MessageBoxButtons.YesNo, MessageBoxIcon.Question)
- If result = DialogResult.Yes Then
- Progress.Width = 475
- Process.Start(My.Settings.WoW_Pfad & "\wow.exe")
- Application.Exit()
- ElseIf result = DialogResult.No Then
- Play.Enabled = True
- Label7.Visible = False
- End If
- End Sub
Tut mir bitte einen gefallen und Steinigt mich nicht für den Code ich bin leider nicht der beste Programmierer versuche aber mein Möglichstes...
Ich habe keine Ahnung warum die Dateien nicht gelöscht werden können... Ich hoffe ihr könnt mir helfen.
Ein dickes Danke schon einmal im vor raus!
EDIT://
Ich habe hier (für das Forum) alle Backslashs (Ich weiß nicht was die Mehrzahl ist O.o) verdoppelt da das Syntax highlighting sonst
einen Fehler ergibt im Code funktioniert das bislang aber Problemlos.
Habt ihr eine Ahnung was ich Falsch mache wo das ganze mir die zip-Dateien sperrt?
Ich denke das es an dem Thread des Backgroundworkers liegt bin mir aber nicht wirklich sicher zumal ich den (glaub ich) 3x den befehl zum schließen gebe um ganz sicher zu gehen...
Ich habe gerade auch einen Test mit zip-Dateien gemacht die insgesammt 30MB groß sind und da klappt das ganze problemlos... Wie kann das sein?
Ich Arbeite mit Visual Studio 2013 Ultimate das habe ich noch vergessen zu erwähnen.
Gruß
Panics
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Panics“ ()