2009-04-12 11 views
1

l'une de mes fonctions d'application consiste à télécharger des fichiers depuis notre serveur ftp. Et bien sûr, cette fonction nécessite d'annuler cette opération (Annuler le téléchargement).Comment interrompre la connexion du serveur en C#

Maintenant, mon téléchargement fonction est la suivante:

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 (ftpStream != null && outputStream!=null) 
        if (ftpStream.CanRead && outputStream.CanWrite) 
        { 
         ftpStream.Close(); 
         outputStream.Close(); 
        } 

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

       return false; 
      } 

Maintenant, comme vous pouvez le voir dans Catch bloc, vous pouvez voir que je suis en train d'interrompre cette connexion lorsque l'utilisateur clique sur le bouton Annuler.

  • Annulation scénario de fonctionnement:

1) bouton Annuler a été cliqué.

2) Fonction d'appel "DoSomeWorx()"

3) dans "DoSomeWorx()" faire:

if (_isItOutputStream)// where here i'm trying to check if it's downloading 
{ 
    ftpStream.Close(); 
    outputStream.Close(); 
    response.Close(); 
} 
if (_startCopy)// check if copying to phone 
{ 
    IsCancelled(); 
} 
_btnDownload2PhoneThread.Abort(); // actually this operation does what i did before but for some resoans it does this but it takes time... 
_btnDownload2PhoneThread.Join(); 

Le problème est quand j'atteins une des opérations suivantes statments (ftpStream.Close();outputStream.Close();response.Close();)

il émet une exception "Fichier indisponible (par exemple, le fichier est occupé)"

et cette exception affecte l'opération de téléchargement lorsque le fichier est occupé.

alors comment éviter cette exception?

Répondre

4

Je suppose que vous avez une forme quelconque, donc vous effectuez le téléchargement sur un fil.

Ce que vous feriez probablement mieux de vérifier un drapeau "cancel" dans votre boucle while.

par ex.

while(readcount > 0 && !cancel) 
{ 
    ... 
} 

Laissez ensuite votre méthode s'annuler.

Deuxièmement, vous devriez utiliser une instruction using sur vos flux. Cela signifie que si vous lancez une exception, le bloc finally garantira que votre flux est éliminé (ce qui est d'ailleurs la raison pour laquelle vous recevriez le fichier occupé, car le flux n'a pas encore eu son destructeur, même si votre méthode est terminée)

+0

J'ai ajouté le drapeau à ma boucle mais toujours quand il atteint à outputStream.Fermeture de response.close(); ou ftpStream.close() statment il lève une exception dit que le fichier est indisponible (par exemple le fichier est occupé) – BDeveloper

+0

Avez-vous supprimé le code touchant les flux dans votre méthode "annuler"? Supprimez l'abandon du thread, et "essayez" de rejoindre le thread. Si cela prend trop de temps, vous pouvez vouloir l'annuler ensuite. Deuxièmement, quelle ligne lance l'exception. Si vous regardez les détails de l'exception, il vous le dira. – Spence