Question

Je suis la construction d'une classe utilitaire FTP en C #. Dans le cas où un WebException est jeté sur un appel à FtpWebRequest.GetResponse(), dans mon cas, l'exception est levée pour le fichier demandé n'existant sur le serveur distant la variable FtpWebResponse est hors de portée.

Mais même si je déclare la variable en dehors du bloc de try..catch je reçois une erreur de compilation en disant: « L'utilisation de « réponse » variable locale non affecté », mais pour autant que je peux dire qu'il n'y a aucun moyen d'assigner jusqu'à ce que vous attribuez la réponse par la méthode de FtpWebRequest.GetResponse().

Quelqu'un peut-il s'il vous plaît conseiller, ou suis-je manque quelque chose évidente?

Merci!

Voici ma méthode actuelle:

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
            }
        }
Était-ce utile?

La solution

Comme moyen générique de résoudre ce problème, juste attribuer null à la réponse d'abord, puis vérifier dans le bloc catch si elle est null.

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

Cependant, dans ce cas précis, vous avez toutes les propriétés dont vous avez besoin sur l'instance de WebException (y compris le réponse du serveur )!

Autres conseils

La solution correcte au problème se trouve dans cette question ici:
Comment vérifier si le fichier existe sur FTP avant FtpWebRequest

En bref:
Votre variable « réponse » sera toujours nulle à cause de l'erreur. Vous devez tester la FtpWebResponse de « webex.Response » (jeter) pour obtenir le StatusCode.

Eh bien, vous pouvez toujours assigner une variable:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top