Domanda

Sto costruendo una classe di utilità FTP in C #. Nel caso in cui un WebException è gettato su una chiamata a FtpWebRequest.GetResponse(), nel mio caso l'eccezione viene generata per il file richiesto non esistente sul server remoto la variabile FtpWebResponse è fuori portata.

Ma anche se io dichiaro la variabile all'esterno del blocco try..catch ottengo un errore di compilazione dicendo: "L'uso della non assegnato variabile locale 'risposta'", ma per quanto ne so non c'è modo di assegnare fino a quando si assegna la risposta attraverso il metodo FtpWebRequest.GetResponse().

Qualcuno può consigliare, o mi sto perdendo qualcosa di ovvio?

Grazie!

Ecco il mio attuale metodo:

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
            }
        }
È stato utile?

Soluzione

Come modo generico per risolvere questo, basta assegnare null alla risposta prima e quindi controllare nel blocco catch se è null.

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

Tuttavia, in questo caso specifico, si hanno tutte le proprietà è necessario per l'istanza WebException (compreso il server di risposta )!

Altri suggerimenti

La soluzione corretta del problema può essere trovata in questa domanda qui:
Come verificare se il file esiste su FTP prima FtpWebRequest

In breve:
La variabile 'risposta' sarà sempre nullo a causa dell'errore. È necessario testare il FtpWebResponse da 'webex.Response' (cast) per ottenere lo StatusCode.

Bene si può sempre assegnare una variabile:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top