Laden...

C# - FTP-Server unbekannter Überprüfungsfehler

Erstellt von Dultus vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.119 Views
D
Dultus Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren
C# - FTP-Server unbekannter Überprüfungsfehler

Einen guten Abend nochmals...

Ich habe meinen Code jetzt ausgebaut.

public partial class Form1 : Form
    {
        private bool endnr = false;

        public Form1()
        {
            InitializeComponent();

            string Dat = "ftp://dultus.lima-ftp.de/";


            var Exists = (FtpWebRequest)WebRequest.Create(Dat+"+1+.txt");
            Exists.Credentials = new NetworkCredential("dultus", "PASSWORT");
            Exists.Method = WebRequestMethods.Ftp.GetFileSize;
            try
            {
                FtpWebResponse Anfrage = (FtpWebResponse)Exists.GetResponse();
                {
                    int nr = 1;
                    endnr = false;
                    while (endnr == false)
                    {
                        string Tester = "+" + Convert.ToString(nr)+"+.txt";
                        var Existingnr = (FtpWebRequest)WebRequest.Create(Dat+Tester);
                        Existingnr.Credentials = new NetworkCredential("dultus", "PASSWORT");
                        string[] ArrayZahl = Tester.Split('+');
                        nr = Convert.ToInt32(ArrayZahl[1]);
                        try
                        {
                            FtpWebResponse response = (FtpWebResponse)Existingnr.GetResponse();
                            nr++;
                        }
                        catch (WebException Ex)
                        {
                            FtpWebResponse response = (FtpWebResponse)Ex.Response;
                            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                            {
                                endnr = true;
                            }
                        }
                    }

                    //Ein Request erstellen an den ftp Server
                    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Dat +"+"+ nr + "+.txt");

                    //Die Methode angeben um eine Datei hochzuladen
                    request.Method = WebRequestMethods.Ftp.UploadFile;

                    //Berechtigungsdetails setzen vom ftp Server durch Username und Passwort
                    request.Credentials = new NetworkCredential("Dultus", "PASSWORT");

                    try
                    {
                        //Versuch eine Verbindung zu erstellen und eine Antwort zu erhalten
                        WebResponse response = request.GetResponse();
                        MessageBox.Show("Response hat funktioniert");
                    }
                    catch (Exception exp)
                    {
                        throw exp;
                    }


                    //Neuer FileStream erstellen für die Datei
                    FileStream fs = new FileStream("C://Beispiele/MyFile.txt", FileMode.Open);
                    byte[] fileContents = new byte[fs.Length];
                    fs.Read(fileContents, 0, Convert.ToInt32(fs.Length));
                    fs.Flush();
                    fs.Close();

                    //Ein neuen Stream für den Request erstellen dem der FileStream mitgegeben wird.
                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(fileContents, 0, fileContents.Length);
                    requestStream.Close();

                    //Verbindung abbschliessen
                    request.Abort();
                }
            }

            catch (WebException ex)
            {
                FtpWebResponse Anfrage = (FtpWebResponse)ex.Response;
                if (Anfrage.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                {
                    //Ein Request erstellen an den ftp Server
                    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Dat + "+1+.txt");

                    //Die Methode angeben um eine Datei hochzuladen
                    request.Method = WebRequestMethods.Ftp.UploadFile;

                    //Berechtigungsdetails setzen vom ftp Server durch Username und Passwort
                    request.Credentials = new NetworkCredential("Dultus", "PASSWORT");

                    try
                    {
                        //Versuch eine Verbindung zu erstellen und eine Antwort zu erhalten
                        WebResponse response = request.GetResponse();
                        MessageBox.Show("Response hat funktioniert");
                    }
                    catch (Exception exp)
                    {
                        throw exp;
                    }


                    //Neuer FileStream erstellen für die Datei
                    FileStream fs = new FileStream("C://Beispiele/MyFile.txt", FileMode.Open);
                    byte[] fileContents = new byte[fs.Length];
                    fs.Read(fileContents, 0, Convert.ToInt32(fs.Length));
                    fs.Flush();
                    fs.Close();

                    //Ein neuen Stream für den Request erstellen dem der FileStream mitgegeben wird.
                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(fileContents, 0, fileContents.Length);
                    requestStream.Close();

                    //Verbindung abbschliessen
                    request.Abort();

                }
            }
        }

Das Problem ist hier, dass bei

var Exists = (FtpWebRequest)WebRequest.Create(Dat+"+1+.txt");
            Exists.Credentials = new NetworkCredential("dultus", "PASSWORT");
            Exists.Method = WebRequestMethods.Ftp.GetFileSize;
            try
            {
                FtpWebResponse Anfrage = (FtpWebResponse)Exists.GetResponse();
                {
                    int nr = 1;
                    endnr = false;
                    while (endnr == false)
                    {
                        string Tester = "+" + Convert.ToString(nr)+"+.txt";
                        var Existingnr = (FtpWebRequest)WebRequest.Create(Dat+Tester);
                        Existingnr.Credentials = new NetworkCredential("dultus", "PASSWORT");
                        string[] ArrayZahl = Tester.Split('+');
                        nr = Convert.ToInt32(ArrayZahl[1]);
                        try
                        {
                            FtpWebResponse response = (FtpWebResponse)Existingnr.GetResponse();
                            nr++;
                        }
                        catch (WebException Ex)
                        {
                            FtpWebResponse response = (FtpWebResponse)Ex.Response;
                            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
                            {
                                endnr = true;
                            }
                        }
                    }

Der Catch irgendwie nicht mehr ausgelöst wird. Visual Studio friert dann einfach ein.
Das Programm an sich funktioniert, wie ich will. Es werden 2 Textdateien erstellt. Jedoch überprüft er die Folgenden nicht und der Fehler tritt auf. Ein Exception wird mir nicht ausgeworfen.

Eine Alternative wäre dabei auch schön (Ich bin Schüler und lerne das momentan von mir selbst). Ist das auch ohne den Catch eventuell umbaubar (Eine Reparatur meines Scriptes würde ich aber bevorzugen)?

Ich danke für jede Hilfe!

16.807 Beiträge seit 2008
vor 7 Jahren

Vermutlich eine Endlosschleife.
Bekommste raus, wenn Du in Deine Schleife einen Breakpoint setzt: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Allein die Tatsache, dass es immer eine Endlosschleife gibt, wenn KEINE Exception (nur in der Exception wird die Abbruchbedingung gesetzt) geworfen wird, ist eine fragwürdige Logik.

D
Dultus Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren

Es ist keine Endlosschleife. Es werden vorher 2 Dateien hochgeladen, welche vorerst überprüft werden, ob diese denn schon existieren. Es funktioniert also auch. Sogar 2 Mal. Wenn ich einen Breakpoint setze, kommt der besagte Fehler nach dem 3.+ Male. Ich erhalte keine Meldung und das Programm friert ein.

H
523 Beiträge seit 2008
vor 7 Jahren

In welcher Zeile friert der Code ein?

D
Dultus Themenstarter:in
5 Beiträge seit 2017
vor 7 Jahren
                        try
                        {
                            FtpWebResponse response = (FtpWebResponse)Existingnr.GetResponse();
                            nr++;
                        }

Bei dem FtpWebResponse response = (FtpWebResponse)Existingnr.GetResponse();
Das geht Programm solange es nicht weiter als 2 zählen muss.

16.807 Beiträge seit 2008
vor 7 Jahren

Dann passt Deine Beschreibung nicht zum Problem.

GetResponse blockiert solange, bis Content verfügbar ist, oder das Timeout erreicht wurde.
Danach wird eine WebException geworfen. Steht auch so in der Dokumentation.

Dass Visual Studio abstürzt kann nicht davon kommen.

Dass das Programm selbst so aussieht, als würde es einfrieren, wird hier erklärt:
[FAQ] Warum blockiert mein GUI?