Pergunta

Estou construindo uma classe de utilitário FTP em C #. No caso em que um WebException é jogado em uma chamada para FtpWebRequest.GetResponse(), no meu caso a exceção é lançada para o arquivo solicitado não existir no servidor remoto a variável FtpWebResponse está fora do escopo.

Mas mesmo se eu declarar a variável fora do bloco try..catch eu recebo um erro de compilação dizendo "Uso de unassigned variável local 'resposta'", mas tanto quanto eu posso dizer que não há maneira de atribuí-la até que você atribua a resposta através do método FtpWebRequest.GetResponse().

Por favor alguém pode aconselhar, ou estou faltando algo óbvio?

Obrigado!

Aqui é o meu método atual:

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

Solução

Como forma genérica para resolver isso, basta null atribuir à resposta em primeiro lugar e, em seguida, verifique no bloco catch se é null.

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

No entanto, neste caso específico, você tem todas as propriedades que você precisa na instância WebException (incluindo o servidor resposta )!

Outras dicas

A solução correta para o problema pode ser encontrada nesta questão aqui:
Como verificar se o arquivo existe no FTP antes FtpWebRequest

Em suma:
A variável 'resposta' será sempre nula por causa do erro. Você precisa testar o FtpWebResponse de 'webex.Response' (cast-lo) para obter o StatusCode.

Bem, você pode sempre atribuir uma variável:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top