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