Download Fortschritt - Eigene Methode

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von SchokoMilch.

    Download Fortschritt - Eigene Methode

    Hallo.
    Ich habe mir für den Download Fortschritt bzw. dem Status eine eigene Methode gemacht.
    Timer1:

    VB.NET-Quellcode

    1. Download = My.Computer.FileSystem.GetFileInfo(".\Spiele\" & ListBox1.SelectedItem & ".rar").Length
    2. Timer2.Start()
    3. Timer1.Stop()

    Timer2:

    VB.NET-Quellcode

    1. Download2 = My.Computer.FileSystem.GetFileInfo(".\Spiele\" & ListBox1.SelectedItem & ".rar").Length
    2. If Download2 > Download Then
    3. Timer1.Start()
    4. Timer2.Stop()
    5. Else
    6. Label7.Text = "Download Abgeschlossen"
    7. Timer2.Stop()
    8. End If

    Beide haben einen Interval von 2 Sekunden.

    Das Label am ende des Downloads ändert sich nicht.
    Könnt ihr mir auf die sprünge helfen? ;)

    Gruß
    Vielleicht malst Du mal auf, was wie ablaufen soll, es werden nur Längen ausgelesen, keine Inhalte.
    Ich glaube nicht, dass Du während eines Downloads die aktuelle Länge ausgelesen bekommst!
    Wozu brauchst Du 2 Timer?
    Pack die ganze Logik in die eine Timer-Tick-Prozedur.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo

    Probiers vielleicht mal mit dem DeinWebClient.DownloadProgressChanged Event

    Wenn du es noch mit einem Progressbar machen willst:

    VB.NET-Quellcode

    1. Private Sub Download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    2. ProgressBar1.Maximum = e.TotalBytesToSend
    3. ProgressBar1.Value = e.ProgressPercentage / 100 * e.BytesSent
    4. ProgressBar1.Refresh()
    5. Label1.Text = "Upload" & " - " & e.ProgressPercentage & "% hochgeladen!"
    6. End Sub

    Um auf diesen Sub zugreifen zu können:

    VB.NET-Quellcode

    1. Dim Downloader As New System.Net.WebClient
    2. AddHandler Downloader.DownloadProgressChanged, addressOf Download_DownloadProgressChanged
    3. Downloader.DownloadFileAsync(New Uri(Url), ".\Spiele\" & ListBox1.SelectedItem & ".rar")



    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Switcherlapp97 schrieb:

    Hallo

    Probiers vielleicht mal mit dem DeinWebClient.DownloadProgressChanged Event

    Wenn du es noch mit einem Progressbar machen willst:

    VB.NET-Quellcode

    1. Private Sub Download_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)
    2. ProgressBar1.Maximum = e.TotalBytesToSend
    3. ProgressBar1.Value = e.ProgressPercentage / 100 * e.BytesSent
    4. ProgressBar1.Refresh()
    5. Label1.Text = "Upload" & " - " & e.ProgressPercentage & "% hochgeladen!"
    6. End Sub

    Um auf diesen Sub zugreifen zu können:

    VB.NET-Quellcode

    1. Dim Downloader As New System.Net.WebClient
    2. AddHandler Downloader.DownloadProgressChanged, addressOf Download_DownloadProgressChanged
    3. Downloader.DownloadFileAsync(New Uri(Url), ".\Spiele\" & ListBox1.SelectedItem & ".rar")



    Gruß
    Switcherlapp97

    Direkt mal Ausprobiert, jedoch muss ich noch irgendwas Importieren.
    Fehler 2 "BytesSent" ist kein Member von "System.Net.DownloadProgressChangedEventArgs".
    Fehler 1 "TotalBytesToSend" ist kein Member von "System.Net.DownloadProgressChangedEventArgs".
    Hallo,

    BytesToSend und BytesSend ist fürs Uploaden, die DownloadProgressChangedEventArgs liefern dir aber:

    TotalBytesToRecieve und BytesRecieved

    VB.NET-Quellcode

    1. Private Sub wc_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles wc.DownloadProgressChanged
    2. Me.Text = e.ProgressPercentage & "/" & e.BytesReceived & "/" & e.TotalBytesToReceive
    3. End Sub


    mfG

    Derfuhr
    Tut mir leid habe eine Fortschrittsanzeige bei einem Upload benötigt und habe von dort den Code schnell raus kopiert. Bei Downloads ist es natürlich TotalBytesToReceive und BytesRecieved
    RubiksCubeSolver


    Jetzt im Showroom
    Danke, funktioniert sehr gut.
    Eine Frage die etwas vom Thema Abgeht:
    Ich habe schon viele Methoden vom automatischen Entpacken gesehen, welche davon ist die einfachste (von .rar Archiven)?
    Die Batch lösung möchte ich nicht benutzen. Leute die nicht Winrar installiert haben, sollten dies auch nutzen können.
    Du könntest zum Entpacken auch die Command Line von 7zip mitreichen.
    Müsstest du dann nur noch mit der Process-Klasse und den richtigen Parametern aufrufen.
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
    Hallo

    Also für Zip hätte ich ein Möglichkeit ...

    Neue Class mit folgendem Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Shell32
    3. Imports System
    4. Public Class Class1
    5. Private _file As String
    6. Private _folder As String
    7. Private _towhere As String
    8. Private _shell As Shell32.IShellDispatch2
    9. ''' <summary>Event welches vor dem Entpacken (Unzip) ausgeführt wird.</summary>
    10. ''' <remarks></remarks>
    11. Public Event Unzipstart()
    12. ''' <summary>Event welches nach dem Entpacken (Unzip) ausgeführt wird.</summary>
    13. ''' <remarks></remarks>
    14. Public Event UnzipFinishd()
    15. ''' <summary>Neue Instanz der ClassUnzip Klasse.</summary>
    16. ''' <param name="file">Datei welche entpackt werden soll.</param>
    17. ''' <param name="towhere">Zielordner.</param>
    18. ''' <remarks></remarks>
    19. Public Sub New(ByVal file As String, ByVal towhere As String)
    20. _file = file
    21. _towhere = towhere
    22. _folder = Path.Combine(Path.GetDirectoryName(_file), _towhere)
    23. _shell = CreateObject("Shell.Application")
    24. End Sub
    25. ''' <summary>Das Entpacken (Unzip) wird ausgeführt.</summary>
    26. ''' <returns></returns>
    27. ''' <remarks></remarks>
    28. Public Function UnzipNow() As Boolean
    29. 'prüfen ob der ordner existiert
    30. If Directory.Exists(_folder) = False Then
    31. Directory.CreateDirectory(_folder)
    32. End If
    33. 'event für start feuern
    34. RaiseEvent Unzipstart()
    35. 'entpacken
    36. Dim temp As Shell32.Folder = _shell.NameSpace((_folder))
    37. If temp IsNot Nothing Then
    38. temp.CopyHere(_shell.NameSpace((_file)).Items)
    39. End If
    40. 'event für ende feuern
    41. RaiseEvent UnzipFinishd()
    42. 'rückgabe wert setzen
    43. Return True
    44. End Function
    45. ''' <summary>Gibt den Namen der gepackten Datei zurück, oder setzt diesen.</summary>
    46. ''' <value></value>
    47. ''' <returns></returns>
    48. ''' <remarks></remarks>
    49. Public Property UnZipFile() As String
    50. Get
    51. Return _file
    52. End Get
    53. Set(ByVal value As String)
    54. _file = value
    55. End Set
    56. End Property
    57. ''' <summary>Gibt den Zielort (entpacken) zurück, oder setzt diesen.</summary>
    58. ''' <value></value>
    59. ''' <returns></returns>
    60. ''' <remarks></remarks>
    61. Public Property UnzipTo() As String
    62. Get
    63. Return _towhere
    64. End Get
    65. Set(ByVal value As String)
    66. _towhere = value
    67. End Set
    68. End Property
    69. End Class

    Mit einem Button kannst du das dann aufrufen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Using ofd As New OpenFileDialog
    3. ofd.Filter = "ZipFile|*.zip"
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. Dim file As String = ofd.FileName
    6. Dim cu As New Class1(file, Path.Combine(Path.GetDirectoryName(file), "test_unzip_folder"))
    7. AddHandler cu.UnzipFinishd, AddressOf Unziped
    8. cu.UnzipNow()
    9. End If
    10. End Using
    11. End Sub
    12. Private Sub Unziped()
    13. MsgBox("Erfolgreich entpackt!")
    14. End Sub


    Ob das auch mit *.rar funktioniert oder ob es überhaupt mit zip funktionert musst du testen. Kann den Code momentan grad nicht selber ausprobieren ...

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Switcherlapp97“ ()

    Hallo

    Ich hab es jetzt nicht ausprobiert aber probier es mal so

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim file As String = "C:\deinezip.zip"
    3. Dim cu As New Class1(file, Path.Combine(Path.GetDirectoryName(file), "test_unzip_folder"))
    4. AddHandler cu.UnzipFinishd, AddressOf Unziped
    5. cu.UnzipNow()
    6. End Sub
    RubiksCubeSolver


    Jetzt im Showroom

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. If Sytem.IO.File.exists("Pfad zur Datei")
    3. Dim cu As New Class1("Pfad zur Datei","Ordner wohin Dateien entpackt werden sollen")
    4. AddHandler cu.UnzipFinishd, AddressOf Unziped
    5. cu.UnzipNow()
    6. Else
    7. MessageBox.Show("File not exist", "error", MessageBoxButtons.OK)
    8. End If
    9. End Sub


    Class1 erwartet im Konstruktor 2 Strings, der 1. Ist der Pfad zur Zip Datei, der 2. der Ordner wohin die Dateien entpackt werden soll.

    //Da war jemand schneller ;)
    "Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." Albert Einstein
    Habe jetzt den Code schnell ausprobiert und da kommt ne Fehlermeldung mit der ich überhaupt nichts anfangen kann ...

    Der Fehler kommt in dieser Zeile:

    VB.NET-Quellcode

    1. _shell = CreateObject("Shell.Application")


    Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "vbparadise.Shell32.IShellDispatch2" umgewandelt werden. Dieser Vorgang konnte nicht durchgeführt werden, da der QueryInterface-Aufruf an die COM-Komponente für die Schnittstelle mit der IID "{708FA028-E47D-347F-B8F4-4F2F356AA8F9}" aufgrund des folgenden Fehlers nicht durchgeführt werden konnte: Schnittstelle nicht unterstützt (Ausnahme von HRESULT: 0x80004002 (E_NOINTERFACE)).

    Hat jemand ne Erklärung wieso der Code nicht funktioniert??
    RubiksCubeSolver


    Jetzt im Showroom