Frage

Ich baue eine FTP-Utility-Klasse in C #. In dem Fall, dass ein WebException auf einem Anruf ausgelöst wird, FtpWebRequest.GetResponse(), in meinem Fall ist die Ausnahme für die angeforderte Datei auf dem Remote-Server ist außerhalb des Gültigkeitsbereiches nicht vorhandenen geworfen der FtpWebResponse Variable.

Aber selbst wenn ich die Variable außerhalb des try..catch Block deklarieren erhalte ich einen Compiler-Fehler sagen: „Die Verwendung von nicht zugewiesenen lokalen Variablen‚response‘“, aber soweit ich das sagen kann, gibt es keine Möglichkeit, es zu vergeben, bis Sie die Antwort vergeben über die FtpWebRequest.GetResponse() Methode.

Kann jemand bitte raten, oder bin ich etwas fehlt offensichtlich?

Danke!

Hier ist meine aktuelle Methode:

private void Download(string ftpServer, string ftpPath, string ftpFileName, string localPath, 
                           string localFileName, string ftpUserID, string ftpPassword)
    {
        FtpWebRequest reqFTP;
        FtpWebResponse response;
        try
        {
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"
               + ftpServer + "/" + ftpPath + "/" + ftpFileName));
            reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
            reqFTP.UseBinary = true;
            reqFTP.Credentials = new NetworkCredential(ftpUserID,
                                                       ftpPassword);

            /* HERE IS WHERE THE EXCEPTION IS THROWN FOR FILE NOT AVAILABLE*/
            response = (FtpWebResponse)reqFTP.GetResponse();
            Stream ftpStream = response.GetResponseStream();


            FileStream outputStream = new FileStream(localPath + "\\" +
               localFileName, FileMode.Create);

            long cl = response.ContentLength;
            int bufferSize = 2048;
            int readCount;
            byte[] buffer = new byte[bufferSize];

            readCount = ftpStream.Read(buffer, 0, bufferSize);
            while (readCount > 0)
            {
                outputStream.Write(buffer, 0, readCount);
                readCount = ftpStream.Read(buffer, 0, bufferSize);
            }

            ftpStream.Close();
            outputStream.Close();
            response.Close();
        }
        catch (WebException webex)
        {
            /*HERE THE response VARIABLE IS UNASSIGNED*/
            if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) { 
                //do something
            }
        }
War es hilfreich?

Lösung

Als generische Art und Weise, dies zu lösen, weisen nur null auf die Antwort und dann im catch-Block prüfen, ob es null ist.

    FtpWebResponse response = null;
    try
    {
...
    }
    catch (WebException webex)
    {
        if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) { 
            //do something
        }
    }

Doch in diesem speziellen Fall haben Sie alle Eigenschaften, die Sie auf der WebException Instanz müssen (einschließlich der Serverantwort )!

Andere Tipps

Die richtige Lösung für das Problem finden Sie hier in dieser Frage zu finden:
Wie kann man überprüfen, ob die Datei auf FTP vor FtpWebRequest existiert

Kurz gesagt:
Ihre ‚Antwort‘ Variable wird immer null sein, weil der Fehler. Sie müssen die FtpWebResponse von ‚webex.Response‘ testen (Guss es), um den Statuscode zu erhalten.

Nun könnte man immer eine Variable zuweisen:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top