Code mit verschiedenen Dateien wiederholen? Und, mit Webbrowser mehrere Dateien runterladen (z.B. mit Warteschlange)?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Agita.

    Code mit verschiedenen Dateien wiederholen? Und, mit Webbrowser mehrere Dateien runterladen (z.B. mit Warteschlange)?

    Hallo

    Ich möchte gerne eine Funktion schreiben, mit der ich mehrere Dateien mit dem selben Code überprüfen kann.

    Ich schreibe gerade an einer Funktion die den MD5 einer Datei ermittelt und diesen mit den MD5 einer Datei auf meinen Server abgleicht und die Datei (wenn es ein anderer MD5 ist) runterlädt. Nach diesen Prinzip habe ich ca. 130 Webclienten (wegen 130 zu überprüfenden Dateien) im Code und muss 130 DownloadStringCompleted erstellen, alle mit verschiedenen Dateien, das kann es aber nicht sein, oder? ... Schon nach 5 Min. habe ich keine Lust mehr weiter zu schreiben ... Den überblick habe ich schon lange nicht mehr.

    (Für diesen Thread, angenommen ich habe noch 4 weitere Dateien die überprüfen will mit einen WebClient; Time.ez, List.ez, Item.ez, Read.ez)

    VB.NET-Quellcode

    1. Dim ProgramFiles As String = Application.StartupPath & "\Files"

    VB.NET-Quellcode

    1. WithEvents DownloadFiles As New Net.WebClient

    VB.NET-Quellcode

    1. Dim FTP As String = "http://Server.net/ProgramFiles/"

    VB.NET-Quellcode

    1. Me.DownloadFiles.DownloadStringAsync(New Uri(FTP & "MD5/Time.ez"))

    VB.NET-Quellcode

    1. Private Sub DownloadFiles_DownloadStringCompleted(sender As Object, e As Net.DownloadStringCompletedEventArgs) Handles DownloadFiles.DownloadStringCompleted
    2. If MD5Hash.MD5FileHash(ProgramFiles & "Time.ez") = e.Result Then
    3. Else
    4. DownloadFiles.DownloadFileAsync(New Uri(FTP & "/ProgramFiles/Time.ez"), ProgramFiles & "Time.ez")
    5. End If
    6. End Sub


    Ich hoffe ihr könnt mir da weiterhelfen :)
    "Denken ist die schwerste Arbeit, die es gibt. Das ist wahrscheinlich auch der Grund, warum sich so wenig Leute damit beschäftigen." - Henry Ford
    Pcck die Pfade + Namen in eine List(Of URI) und arbeite diese Liste mit For Each myUri in myUriList ab.
    Feddich. :D
    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!

    Vultrax schrieb:

    Wie genau soll ich da alles einfügen?
    248 Beiträge im Forum und noch nix dazugelernt?
    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!
    @RodFormGermany: Haste ja eigentlich recht, aber: (Ich habe ein kleines Verständnis- und Lernproblem)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    ick würd ja eher ne datei erstellen. jede zeile, eine addresse. die müsste man dann auch in die ressourcen packen können und dann mittels "my.ressources.dsfsafasdf" wieder abfragen können.

    hab grad ne dicke PIZZAA vor mir, kann gleich nen beispiel dazu geben
    Ne List(Of T) ist schon keine schlechte Sache. Dort kannst du relativ einfach neue Elemente hinzufügen.

    Was den Download angeht, dort wurde ich einen synchronen Download machen. Also anstatt "DownloadStringAsync" einfach "DownloadString".
    Dort hast du den Vorteil, dass du nicht immer die Events abfragen musst.

    Würde in der Praxis etwa so aussehen:

    VB.NET-Quellcode

    1. Sub checkUpdates(ByRef FileList As List(of String))
    2. For Each File As String in FileList
    3. Dim currentServerMD5 As String = DownloadFiles.DownloadString(New URI(FTP & File))
    4. If Not MD5Hash.MD5FileHash(ProgramFiles & File") = currentServerMD5 Then
    5. DownloadFiles.DownloadFileAsync(New Uri(FTP & File), ProgramFiles & File)
    6. End If
    7. Next
    8. End Sub


    So könnte es z.B. aussehen.
    Die Sub sollte man dann aber auch von einem anderen Thread aus aufrufen. Stichworte hierfür sind "Multithreading" und "BackGroundWorker".



    Mfg.
    SAR
    pizza war lecker :P

    hmmmm .. sag ma hast du evtl zugriff auf den server?
    is das immer der selbe server? wäre es nicht hübscher nen php-script zu schreiben, das von selbst alle dateien auf dem server einma durchgeht und ne liste erstellt a la

    Quellcode

    1. MD5ASDFGHXCVB|myfile123.txt
    2. MD5QWERTZHGCV|mynextfile.txt
    3. ...


    dann hättest du immer die aktuellste liste mit nur einer anfrage UND du könntest sogar ermitteln, welche dateien sich auf dem server befinden, die du lokal aber (noch) nicht hast. müsstest dann zwar die zeilen splitten und dann nochma den seperator "|" aber denke das wäre besser, als 130(!!!!!) mal eine anfrage an den server zu senden


    EDIT
    vllt findet die variante ja mehr gefallen

    der php teil (dateiname: action.php)

    PHP-Quellcode

    1. <?php
    2. // kann ein ordner sein, der von aussen nicht sichtbar ist
    3. // slash am ende nich vergessen !
    4. $filesPath = "__DEV/";
    5. // md5 liste wurde angefordert
    6. if (isset($_GET["md5"]))
    7. {
    8. function getAllMD5($d="")
    9. {
    10. global $filesPath;
    11. if (($h = @opendir($filesPath.$d)) === false) return false;
    12. while (($f = readdir($h)) !== false)
    13. {
    14. if ($f == "." || $f == "..") continue;
    15. if (getAllMD5("{$d}{$f}/")) continue;
    16. echo md5($filesPath.$d.$f)."|".base64_encode("{$d}{$f}")."\r\n";
    17. }
    18. closedir($h);
    19. return true;
    20. }
    21. getAllMD5();
    22. exit();
    23. }
    24. // datei zum herunter laden angefordert
    25. elseif (isset($_GET["dl"]))
    26. {
    27. // wandle wieder base64filename in normalen dateinamen um
    28. $dl = base64_decode($_GET["dl"]);
    29. // sicherheit!!
    30. // lösche alle ../
    31. // damit nicht aus anderen ordnern gelesen werden kann
    32. $dl = preg_replace("!\.\.\/!", "", $dl);
    33. // füge den absoluten pfad mit der angeforderten datei zusammen
    34. $dl = "{$filesPath}{$dl}";
    35. // datei existiert nicht ?
    36. // sende 404 status und breche ab
    37. if (!file_exists($dl))
    38. {
    39. header("HTTP/1.0 404 Not Found");
    40. exit();
    41. }
    42. // alles ok ? dann ab damit
    43. header("content-disposition: attachment; filename={$dl}");
    44. header("content-type: application/octet-stream");
    45. header("content-length: " . filesize($dl));
    46. readfile($dl);
    47. exit();
    48. }

    der vb.net teil

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Imports System.Windows.Forms
    3. Imports System.IO
    4. Imports System.Net
    5. Imports System.Text
    6. Module Module1
    7. Private serverActionFile As String = "http://localhost/action.php"
    8. Private downloadAddress As String = serverActionFile + "?dl="
    9. Private md5listAddress As String = serverActionFile + "?md5"
    10. Private LocalFilesPath As String = Application.StartupPath + "/myfiles/"
    11. Private WC As New WebClient()
    12. Sub Main()
    13. Dim checkThread As New Thread(AddressOf CheckThreadSub)
    14. checkThread.Start()
    15. End Sub
    16. Private Sub checkFile(file As String, md5 As String)
    17. ' diese sub wird aufgerufen von der schleife ganz unten.
    18. ' diese sub wird aufgerufen, für jeden eintrag von der md5-liste
    19. '...
    20. ' nur zum testen
    21. MessageBox.Show(LocalFilesPath + file + " = " + md5)
    22. downloadFile(file)
    23. '...
    24. End Sub
    25. Private Sub downloadFile(file As String)
    26. ' zum herunterladen müssen wir wieder den originalen dateinamen
    27. ' in base64 umwandeln. ist einfach schöner so...
    28. Dim base64filename As String = Convert.ToBase64String(Encoding.Default.GetBytes(file))
    29. ' das hier ist nur zum test
    30. MessageBox.Show(WC.DownloadString(serverActionFile + "?dl=" + base64filename))
    31. ' darum beende ich hier mal
    32. Return
    33. ' lädt die datei herunter
    34. WC.DownloadFile(downloadAddress + base64filename, LocalFilesPath + file)
    35. End Sub
    36. Private Sub CheckThreadSub()
    37. ' lade die gesammte md5 liste herunter
    38. ' die sieht so etwa aus:
    39. ' DJZGHGJZFGF|Cuzuiz32ebKJHvb==
    40. ' XGCHVJHBKNK|tfd67687zhgbjkj0sdf=
    41. ' das vor dem | ist der md5 hash, das nach dem | ist der dateipfad im base64 format
    42. ' (damit komplexe zeichen bei der übertragung nicht "verloren" gehen)
    43. Dim md5list() As String = WC.DownloadString(md5listAddress).Split({vbCrLf}, StringSplitOptions.RemoveEmptyEntries)
    44. ' für jede heruntergeladene zeile
    45. For Each listLine As String In md5list
    46. ' splitte bei |
    47. Dim lineSplit() As String = listLine.Trim.Split("|"c)
    48. ' nun müssten wir 2 string haben, wenn nicht, dann zeile ignorieren (evtl leerzeile)
    49. If (lineSplit.Length <> 2) Then Continue For
    50. Dim md5 As String = lineSplit(0)
    51. Dim file As String = Encoding.Default.GetString(Convert.FromBase64String(lineSplit(1)))
    52. checkFile(file, md5)
    53. Next
    54. End Sub
    55. End Module

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Agita“ ()