2009-03-26 6 views
1

J'essaie d'annuler une opération de téléchargement. Mon scénario est le suivant:Erreur lors de la fermeture du flux ftp en C#

Lorsque l'utilisateur clique sur Annuler le téléchargement bouton pour cette action génère une exception dans la fonction de téléchargement qui est comme suit:

 try 
     { 
      reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + uri + "/" + fileName)); 
      reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; 
      reqFTP.UseBinary = true; 
      reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 
      reqFTP.UsePassive = true; 

      response = (FtpWebResponse)reqFTP.GetResponse(); 
      ftpStream = response.GetResponseStream(); 
      _isItOutputStream = true; 
      string dataLengthString = response.Headers["Content-Length"]; 
      int dataLength = 0; 
      if (dataLengthString != null) 
      { 
       dataLength = Convert.ToInt32(dataLengthString); 
      } 

      long cl = response.ContentLength; 
      int bufferSize = 4048; 
      int readCount; 
      byte[] buffer = new byte[bufferSize]; 
      readCount = ftpStream.Read(buffer, 0, bufferSize); 
      outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); 
      bool first = true; 
      while (readCount > 0) 
      { 
       outputStream.Write(buffer, 0, readCount); 
       _actualDownloaded += readCount; 
       if (this.InvokeRequired) 
       { 
        ProgressBarDel _progressDel = new ProgressBarDel(ProgressBar); 
        this.Invoke(_progressDel, new object[] { _actualDownloaded, first }); 
       } 
       first = false; 
       readCount = ftpStream.Read(buffer, 0, bufferSize); 
      } 
      ftpStream.Close(); 
      outputStream.Close(); 
      response.Close(); 
      _isItOutputStream = false; 
      return true; 
     } 
     catch (Exception ee) 
     { 
      _downloadException = ee.Message; 
      if (response != null) 
      { 

       outputStream.Close(); 
       ftpStream.Close(); 
       response.Close(); 
      } 
      return false; 
     } 

Dans la ligne « ftpStream.Close() » ici où l'exception est levée ...

Le texte d'exception est:

The remote server returned an error: (450) File unavailable (e.g., file busy)

où il ouvre un fichier à télécharger que ce que je l'ai écrit "outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); "Je ne vais pas fermer ce flux et de fermer la réponse dans l'ordre si l'utilisateur a fait comme suit: télécharger -> annuler télécharger -> télécharger -> annuler télécharger -> télécharger

si ce scénario s'est produit l'application se bloque . Je ne sais pas comment fermer le flux et la réponse afin que je puisse arrêter le téléchargement, puis supprimer le fichier créé afin de télécharger à nouveau.

thnx

+0

le problème est quand je retélécharger un msg semble que ce fichier est utilisé (bcoz i Annulez la précédente. Le téléchargement et puis essayé de retélécharger à nouveau) – BDeveloper

+0

Vous avez une erreur similaire (téléchargements de fichiers, après le téléchargement sur close() je reçois une erreur ftp 450). Avez-vous trouvé une solution à votre problème? – Sam

Répondre

3

La ligne qui semble être la cause de votre Execption est celui ci-dessous et en raison du serveur FTP de ne pas trouver le fichier que vous voulez. C'est une situation qui pourrait facilement se reproduire, il peut donc être utile de placer un bloc try/catch autour de cette ligne ou d'utiliser un catch sur l'exception spécifique qu'il génère.

ftpStream = response.GetResponseStream(); 

Au moment de votre bloc catch que vous utilisez outputStream.Close() mais si l'exception se produit sur la ligne ci-dessus outputStream sera nulle. À tout le moins, vous devez changer l'ordre de fermeture de vos objets dans votre bloc catch et les vérifier pour null.

if(response != null) { 
    response.Close(); 
} 

if(ftpStream != null) { 
    ftpStream.Close(); 
} 

if(outputStream != null) { 
    outputStream.Close(); 
} 
+0

en fait cette façon jette encore une exception et il continue à dire que le fichier est indisponible J'ai utilisé repFTP.Abort() mais cela aussi jette une exception dans le retrun faux pas disant que reqFTP est fermé.actuellement je ne comprends pas, je veux arrêter le téléchargement et ferme le fichier ouvert lorsque l'utilisateur clique sur le bouton Annuler – BDeveloper

+0

Le téléchargement FTP démarre-t-il? Si vous obtenez la réponse 450 du serveur FTP, il semble que cela ne fonctionne pas. Si le téléchargement ne commence jamais, Abort devrait probablement être évité. – sipwiz

+0

aucun processus de téléchargement fonctionne correctement ce qui est comment 2 interrompre ce processus j'ai essayé toutes les manières que j'ai dites ci-dessus et dans certains cas cela me donne l'erreur? – BDeveloper

1

Ok d'abord, mettez vos fermetures dans un bloc finally. Donc, assurez-vous que votre code est comme ceci pour assurer la fermeture des flux, peu importe quoi.

try 
{ 
    //Your existing logic 
    //Don't need to close the streams/etc 
} 
catch 
{ 
    //Just do what you need to with the exception 
} 
finally 
{ 
    //This is always called 
    if (response != null) 
     response.Close(); 
    if(outputStream != null) 
     outputStream.Close(); 
    if(ftpStream != null) 
     ftpStream.Close(); 
} 

Wrap cette ligne dans une prise d'essai

ftpStream = response.GetResponseStream(); 

Cela devrait être bien aussi longtemps que ces appels s'appelle Close, où est votre logique cancel? Je m'attendrais à voir un drapeau sur la boucle qui est définie lorsque l'utilisateur clique sur un bouton. par exemple.

while (readCount > 0 && !_shouldExit) 
{ 
    outputStream.Write(buffer, 0, readCount); 
    _actualDownloaded += readCount; 
    if (this.InvokeRequired) 
    { 
    ProgressBarDel _progressDel = new ProgressBarDel(ProgressBar); 
    this.Invoke(_progressDel, new object[] { _actualDownloaded, first }); 
    } 
    first = false; 
    readCount = ftpStream.Read(buffer, 0, bufferSize); 
} 
Questions connexes