Zum Inhalt springen

Checksum bei Kopiervorgang (FTP)


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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.

Geschrieben (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 von Goulasz
Geschrieben

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 :)

Geschrieben (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 von Goulasz

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...