2010-03-11 6 views
4

Je construis une classe d'utilitaire FTP en C#. Dans le cas où un WebException est lancé sur un appel à FtpWebRequest.GetResponse(), dans mon cas l'exception est levée pour le fichier demandé non 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 try..catch, j'obtiens une erreur de compilation disant "Utilisation de la variable locale non assignée '", mais pour autant que je sache, il n'y a aucun moyen de l'assigner tant que réponse via la méthode FtpWebRequest.GetResponse().Comment attraper une exception FtpWebResponse en C#

Quelqu'un peut-il s'il vous plaît aviser, ou est-ce que je manque quelque chose d'évident?

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 
      } 
     } 

Répondre

6

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 WebException (y compris le server response)!

+0

jeez, je n'ai même pas essayé cela. Merci pour les deux conseils! J'ai regardé WebExceptionStatus et je ne savais pas s'il y avait un type défini spécifiquement pour 'fichier non trouvé'. Je vais regarder dans ce plus mais le nul devrait le faire. – jaywon

+0

Cela résout le problème de variable locale non affectée, mais n'aide pas à attraper l'exception car la réponse sera toujours nulle lorsque l'erreur se produit. Cochez cette question pour trouver la bonne solution: http://stackoverflow.com/questions/347897/how-to-check-if-file-exists-on-ftp-before-ftpwebrequest – Marc

+0

Marc, notez que j'abordais à la fois le problème en général, ainsi que le cas spécifique avec le 'WebException' - voir le paragraphe du bas (qui est la même solution en bref que celle fournie dans votre lien). – Lucero

1

Eh bien, vous pouvez toujours assigner une variable:

FtpWebRequest reqFTP = null; 
FtpWebResponse response = null; 
+0

merci Darin! (secouant la tête) – jaywon

2

La bonne solution au problème se trouve dans cette question ici:
How to check if file exists on FTP before FtpWebRequest

En bref:
Votre variable 'réponse' sera toujours nul à cause de l'erreur. Vous devez tester FtpWebResponse à partir de 'webex.Response' (lancer) pour obtenir le StatusCode.

+0

Le mien est tout aussi correct. Lire le paragraphe en bas. – Lucero

+0

Vous avez raison, mais le code dans votre réponse est trompeur car il ne permet pas d'attraper l'exception fichier indisponible. – Marc

Questions connexes