Dateien Downloaden, Entpacken und dann zip Löschen?!

  • VB.NET
  • .NET (FX) 4.0

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Panics.

    Dateien Downloaden, Entpacken und dann zip Löschen?!

    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

    VB.NET-Quellcode

    1. Private Sub w_DownloadFileCompleted(sender As Object, e As System.ComponentModel.AsyncCompletedEventArgs) Handles w.DownloadFileCompleted
    2. sw.Stop()
    3. ProgBar.Value = 0
    4. ListBox2.Items.Clear()
    5. 'MessageBox.Show(e.ToString)
    6. Dim grade As New IO.DirectoryInfo(My.Settings.WoW_Pfad & "\\")
    7. Dim diar As IO.FileInfo() = grade.GetFiles()
    8. Dim dra As IO.FileInfo
    9. Dim Counter As Integer = 0
    10. For Each dra In diar
    11. ListBox2.Items.Add(dra)
    12. Next
    13. For i As Integer = 0 To ListBox1.Items.Count - 1
    14. If Len(Dir(My.Settings.WoW_Pfad & "\\" & ListBox1.Items.Item(i))) <> 0 Then
    15. Counter = Counter + 1
    16. If Counter = ListBox1.Items.Count Then
    17. BackgroundWorker1.RunWorkerAsync()
    18. TextBox1.Text = ""
    19. Label7.Text = "Status - Download - Abgeschlossen"
    20. ProgBar.Value = 100
    21. End If
    22. Else
    23. Schritt = Schritt + 1
    24. Counter = Counter + 1
    25. sw.Start()
    26. w.DownloadFileAsync(New Uri("http://**.**.**.**/downloads/WoW/3.3.5a/" & ListBox1.Items.Item(i)), My.Settings.WoW_Pfad & "\\" & ListBox1.Items.Item(i))
    27. TextBox1.Text = ListBox1.Items.Item(i)
    28. Exit For
    29. End If
    30. Next
    31. End Sub
    32. Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles w.DownloadProgressChanged
    33. sw.Stop()
    34. Speed = Math.Round((e.BytesReceived - zm) / 1024 / (sw.ElapsedMilliseconds / 1000))
    35. ProgBar.Value = e.ProgressPercentage
    36. Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
    37. Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
    38. Dim percentage As Double = bytesIn / totalBytes * 100
    39. Dim down As Integer = bytesIn / 1048576
    40. Dim total As Integer = totalBytes / 1048576
    41. DownStatus = Integer.Parse(Math.Truncate(percentage))
    42. Trigger = 475 / 100 * percentage
    43. Status = DownStatus
    44. Label7.Visible = True
    45. Progress.Width = Trigger
    46. Label7.Text = "Downloade - Datei: " & Schritt & " von " & Schritte & " - " & down.ToString("N0") & "MB" & "/" & total & "MB" & " - " & Status & "%" & " - Datei: " & TextBox1.Text
    47. zm = e.BytesReceived
    48. sw.Restart()
    49. End Sub


    Das Entpacken danach über diesen Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Property CurrentCount As Integer
    2. Private Property TotalCount As Integer = 1
    3. Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    4. ProgBar.Value = e.ProgressPercentage
    5. Trigger = 475 / 100 * ProgBar.Value
    6. Progress.Width = Trigger
    7. Label7.Text = "Entpacke - Datei: " & Datei & " von " & DateienTotal & " - " & ProgBar.Value & "%"
    8. End Sub
    9. Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    10. Timer1.Start()
    11. BackgroundWorker1.CancelAsync()
    12. End Sub
    13. Private Function SearchAndAddToListWithFilter(ByVal path As String, ByVal filters As String(), ByVal searchSubFolders As Boolean) As List(Of IO.FileInfo)
    14. If Not IO.Directory.Exists(path) Then
    15. Throw New Exception("Path not found")
    16. End If
    17. Dim searchOptions As IO.SearchOption
    18. If searchSubFolders Then
    19. searchOptions = IO.SearchOption.AllDirectories
    20. Else
    21. searchOptions = IO.SearchOption.TopDirectoryOnly
    22. End If
    23. Return filters.SelectMany(Function(filter) New IO.DirectoryInfo(path).GetFiles(filter, searchOptions)).ToList
    24. End Function
    25. Private Delegate Sub SetStatusTextInvoker(ByVal Text As String)
    26. Private Sub SetStatusText(ByVal Text As String)
    27. If Me.InvokeRequired Then
    28. Me.Invoke(New SetStatusTextInvoker(AddressOf SetStatusText), Text)
    29. Else
    30. Label7.Text = Text
    31. End If
    32. End Sub
    33. Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    34. Dim TotalSize As Long
    35. Dim ZipToUnpack As String = My.Settings.WoW_Pfad & "\\" & ListBox3.Items.Item(ListBox3.Items.Count - 1).ToString
    36. Dim extractDir As String = My.Settings.WoW_Pfad & "\\"
    37. Try
    38. Using zip As ZipFile = ZipFile.Read(ZipToUnpack)
    39. AddHandler (zip.ExtractProgress), New EventHandler(Of ExtractProgressEventArgs)(AddressOf Zip_ExtractProgress)
    40. For Each Entry As ZipEntry In zip.Entries
    41. DateienTotal = DateienTotal + 1
    42. TotalSize += Entry.UncompressedSize
    43. Next
    44. For Each Entry As ZipEntry In zip.Entries
    45. Datei = Datei + 1
    46. Entry.Extract(extractDir, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently)
    47. Next
    48. End Using
    49. Catch EX As Exception
    50. MessageBox.Show(EX.Message)
    51. End Try
    52. End Sub
    53. Private Sub Zip_ExtractProgress(ByVal sender As Object, ByVal e As ExtractProgressEventArgs)
    54. If BackgroundWorker1.CancellationPending Then
    55. e.Cancel = True
    56. End If
    57. Select Case e.EventType
    58. Case ZipProgressEventType.Extracting_EntryBytesWritten
    59. Dim Entry As Integer
    60. Dim CurrentCount As Integer = Entry
    61. BackgroundWorker1.ReportProgress(CInt(Math.Truncate(100 * (e.BytesTransferred / e.TotalBytesToTransfer))))
    62. If _setCancel Then
    63. ' this Boolean would be set in a event handler for the cancel button
    64. e.Cancel = True
    65. End If
    66. End Select
    67. End Sub


    Und das Löschen sollte dann über diesen Code laufen:

    Timer1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. BackgroundWorker1.CancelAsync()
    3. DeleteUnWanted()
    4. Timer1.Stop()
    5. End Sub


    DeleteUnWanted():
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DeleteUnWanted()
    2. BackgroundWorker1.CancelAsync()
    3. Progress.Width = 475
    4. Label7.Text = "Status - Entpacken: Abgeschlossen - WoW Fertig Installiert"
    5. _setCancel = True
    6. Dim FileToDelete As String
    7. If Len(Dir(My.Settings.WoW_Pfad & "\wow.exe")) <> 0 Then
    8. For i As Integer = 0 To ListBox3.Items.Count - 1
    9. FileToDelete = My.Settings.WoW_Pfad & "\\" & ListBox3.Items.Item(i)
    10. If System.IO.File.Exists(FileToDelete) = True Then
    11. System.IO.File.Delete(FileToDelete)
    12. End If
    13. Next
    14. End If
    15. Dim result As Integer = MessageBox.Show("Das Spiel wurde nun Erfolgreich gedownloaded und Installiert." _
    16. & vbNewLine & "Soll das Spiel nun gestartet werden?", "Soll World of Warcraft gestartet werden?", _
    17. MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    18. If result = DialogResult.Yes Then
    19. Progress.Width = 475
    20. Process.Start(My.Settings.WoW_Pfad & "\wow.exe")
    21. Application.Exit()
    22. ElseIf result = DialogResult.No Then
    23. Play.Enabled = True
    24. Label7.Visible = False
    25. End If
    26. 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“ ()