Maerad Geschrieben 30. Oktober 2012 Teilen Geschrieben 30. Oktober 2012 Hallo Leute! Erst einmal kurz was zu meiner Person. Ich bin neu in diesem Forum und habe im August eine Ausbildung als FIAE begonnen. Vorkenntnisse habe ich nur in HTML,CSS und PHP. Seit beginn der Ausbildung arbeite ich mit C#, was bisher auch ganz gut und ohne Probleme klappt, allerdings habe ich jetzt ein Projekt bei dem ich einfach nicht weiter komme Die Frage habe ich auch bereits in einem anderen Forum gestellt (Checksumme bei Kopiervorgang - Entwickler-Ecke), allerdings habe ich dort bisher keine Antwort bekommen und ich bräuchte dringend Hilfe. Hier einmal der Text aus dem anderen Forum: Hallo Leute! Ich hab ein Problem. Und zwar habe ich ein Programm geschrieben welches Daten von einem FTP Server (mehrere Ordner) in ein lokales Verzeichnis (mehrere Ordner mit Unterordner) kopiert. Für jeden Ordner wird quasi ein neuer Kopiervorgang gestartet, da ich dies mit einer extra FTP Klasse gemacht habe. Jetzt will ich das so machen, das wenn die Daten nicht richtig übertragen wurden oder keine Verbindung bestand, mir eine Mail geschickt wird. Wurden die Daten richtig übertragen wird ebenfalls eine Mail geschickt. Noch dazu wird das Programm sofort beendet wenn die Verbindung zum FTP Server nicht hergestellt werden konnte, also müsste ich die Fehlermail für die Verbindung noch davor verschicken und wenn bei dem Daten übertragen etwas schief gegangen ist nach der Datenübertragung. Die Mail das alles geklappt hat muss ja dann erst ganz am Ende verschickt werden. Bisher habe ich eine extra Klasse für das Mail verschicken genutzt, aber ist es vielleicht einfacher das immer direkt in das Hauptprogramm zu packen oder gibt es eine Möglichkeit das irgendwie auszulesen und an der entsprechenden Stelle eine Mail zu schicken? Mein eigentliches Problem: Ich weiß nicht wie ich gucken kann ob alle Daten richtig übertragen wurden und das er dann eine Mail schickt. Ein Kollege meinte ich solle es mit der Checksumme angehen, nur habe ich nach 3 Monaten Ausbildung noch nicht ganz so viel Erfahrung und im Internet habe ich bisher nichts passendes und für mich verständliches gefunden. Würde mich riesig über Eure Hilfe freuen Auch hier würde ich mich freuen wenn ihr mir helfen könnten, da ich, was das checksum angeht, bisher nix verstanden und auch nicht wirklich etwas hilfreiches im Internet gefunden habe. Grüße Maerad PS: Wenn noch irgendwelche Fragen offen sind um mir helfen zu können, einfach fragen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Oktober 2012 Teilen Geschrieben 30. Oktober 2012 Unterstützt der FTP-Server den XCRC-Befehl? Falls ja -> benutzen. Falls nicht, könntest man serverseitig die Prüfsummen ermitteln und ebenfalls zum Runterladen bereitstellen, beispielweise in einer zusätzlichen Textdatei, die Hashwerte für alle anderen Dateien enthält. Ob du das kannst, hängt davon ab, wie du auf den Server zugreifen kannst. Mit FTP allein geht das nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goulasz Geschrieben 30. Oktober 2012 Teilen Geschrieben 30. Oktober 2012 (bearbeitet) Hallo Maerad! Da gibt es im .NET-Framework ein paar schicke Klassen, die man dafür benutzen kann. Die erste wäre die Klasse MD5, die du in Verbindung mit der FileStream-Klasse benötigst, um aus einer lokalen Datei einen MD5-Hash zu erzeugen. Beispiel, wie ich es mache: /// <summary> /// Gibt den md5-Hash einer Datei zurück /// </summary> /// <param name="Dateipfad">Der Pfad zur auswertenden Datei</param> /// <returns>Der md5-Hash der Datei als string</returns> private string getMD5(string Dateipfad) { //Datei einlesen if (File.Exists(Dateipfad)) { System.IO.FileStream FileCheck = System.IO.File.OpenRead(Dateipfad); // MD5-Hash aus dem Byte-Array berechnen System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] md5Hash = md5.ComputeHash(FileCheck); FileCheck.Close(); //Byte-Array in string wandeln string Berechnet = BitConverter.ToString(md5Hash).Replace("-", "").ToLower(); return Berechnet; } else return "Datei existiert nicht."; }[/PHP] Diesen Vergleich führst du nach dem Download deiner Datei durch, d.h. du brauchst vorher natürlich den MD5-Hash der Datei auf deinem FTP. Das kannst du am schnellsten über einen WebRequest erledigen. Du übergibst in dem Request den Pfad zu deiner Datei auf dem FTP und lässt dir als Rückgabe den MD5 ausgeben. Dafür benötigst du auf deinem Server ein Skript, das du aufrufst und das als Rückgabe den MD5 ausgibt. Ich hatte das in PHP gelöst, müsste allerdings das Skript noch suchen^^. Oder du googlest einfach fix selbst . Stimmen die Werte jetzt überein, hast du entweder den höchst unwahrscheinlichen Fall, mit einer kaputten Datei eine Kollision(erzeugen des gleichen Hashwertes aus unterschiedlichen Ausgangsdateien) erzeugt zu haben, oder die Datei wurde erfolgreich heruntergeladen . Gruß, Ziege /€: md5_file MD5-Hash-Berechnung einer Datei per PHP. Bearbeitet 30. Oktober 2012 von Goulasz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Maerad Geschrieben 30. Oktober 2012 Autor Teilen Geschrieben 30. Oktober 2012 Vielen Dank für die schnellen Antworten! @ Klotzkopp: Ich denke schon das der FTP Server den XCRC-Befehl unterstützt, nur leider kann ich nix genaues dazu sagen. Kenne mich (noch) nicht gut damit aus. Hab die Ausbildung im August begonnen und kannte vorher halt nur sowas wie HTML, CSS und PHP. Berufsschule hatte ich auch noch nicht (erst im Februar), nur da werde ich auch nicht gleich alles lernen, darum bin ich jetzt noch etwas unbeholfen und suche im Internet nach Lösungen/Hilfe. @Zieg0re: Danke für die Erklärung. Durch weiteres googlen habe ich das ganze dann etwas besser verstanden. Habe mir im Internet ein paar Quellcodes gesucht die passen könnten und habe darauf dann eine eigene Klasse gebastelt. Aber danke für deine zur Verfügung gestellten Klasse Ausprobiert habe ich es noch nicht, aber auf das es klappt Dann wäre ich endlich mal fertig mit diesem (für mich) Mammutprojekt. Muss aber sagen das ich dadurch auch wieder einiges gelernt habe und mehr weiß. Hat alles seine Vor- und Nachteile Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goulasz Geschrieben 30. Oktober 2012 Teilen Geschrieben 30. Oktober 2012 (bearbeitet) Hey Maerad! <?php if (isset($_GET['datei'])) $datei = $_GET['datei']; else $datei=""; if ($datei!="") { $summe=md5_file($datei); echo $summe; } ?>[/PHP] Das ist unser PHP-Skript für die MD5-Erzeugung, ich bin selbst nicht ganz so firm in PHP, das mag unter Umständen auch schöner gehen. Wir haben das Skript auf unserem Webserver in dem Ordner abliegen, in den auch die FTP-Daten reinkommen. Ich greife dann mit dem folgenden Code auf das Skript zu, welches mir als Rückkgabe die MD5 der Datei auf dem (im selben Verzeichnis wie dem Skript befindlichen) FTP-Ordner befindet. [code] public string ExecuteWebRequest(string Dateipfad, string body) { var request = (HttpWebRequest)WebRequest.Create("http://DeineURL.de/Skriptname.php?datei=" + Dateipfad); request.Method = "POST"; if (!string.IsNullOrEmpty(body)) { var requestBody = Encoding.UTF8.GetBytes(body); request.ContentLength = requestBody.Length; request.ContentType = "application/json"; using (var requestStream = request.GetRequestStream()) { requestStream.Write(requestBody, 0, requestBody.Length); } } else { request.ContentLength = 0; } request.Timeout = 15000; request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.BypassCache); string output = string.Empty; try { using (var response = request.GetResponse()) { using (var stream = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1252))) { output = stream.ReadToEnd(); } } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { using (var stream = new StreamReader(ex.Response.GetResponseStream())) { output = stream.ReadToEnd(); } } else if (ex.Status == WebExceptionStatus.Timeout) { output = "Request timeout is expired."; } } return output; }[/code] Du kannst jetzt die Rückgabe der getMD5-Methode mit der Rückgabe der ExecuteWebRequest-Methode abgleichen und solltest dann eigentlich zu einem Ergebnis kommen. Das funktioniert bei mir eigentlich einwandfrei, auch wenn es da unter Umständen elegantere Wege geben mag. Ich fand es recht nachvollziehbar und gut verständlich. Gruß, Ziege Bearbeitet 30. Oktober 2012 von Goulasz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.