Pregunta

Estoy construyendo una clase de utilidad FTP en C #. En el caso de que un WebException se lanza en una llamada a FtpWebRequest.GetResponse(), en mi caso, la excepción es lanzada para el archivo solicitado no existe en el servidor remoto la variable FtpWebResponse está fuera de alcance.

Pero incluso si declara la variable fuera del bloque try..catch me sale un error de compilación diciendo "El uso de variable local no asignada 'respuesta'", pero en lo que puedo decir que no hay manera de asignarle hasta que asigne la respuesta a través del método FtpWebRequest.GetResponse().

Por favor alguien puede aconsejar, o me estoy perdiendo algo obvio?

Gracias!

Aquí está mi método actual:

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
            }
        }
¿Fue útil?

Solución

Como forma genérica para solucionar esto, simplemente asignar null a la respuesta primero y luego verificar en el bloque catch si es null.

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

Sin embargo, en este caso específico, usted tiene todas las propiedades que necesita en la instancia WebException (incluyendo el servidor de respuesta )!

Otros consejos

La solución correcta al problema puede encontrarse en esta pregunta aquí:
Cómo comprobar si existe el archivo de FTP antes FtpWebRequest

En resumen:
La variable 'respuesta' siempre será nula a causa del error. Es necesario poner a prueba la FtpWebResponse de 'webex.Response' (echarlo) para obtener el StatusCode.

Bueno siempre se puede asignar una variable:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top