Witam, od razu poniżej kodzik :
private AutoResetEvent _resetEvent = new AutoResetEvent(false);
public void Cancel()
{
BackgroungWorker.CancelAsync();
_resetEvent.WaitOne();
}
private void BackgroungWorker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
while (!e.Cancel)
{
String strAppDir = Path.GetDirectoryName(
Assembly.GetExecutingAssembly().GetName().CodeBase);
this._localPath = strAppDir;
FileInfo fileInfo = new FileInfo(name2);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftpserv" + name2);
request.Credentials = new NetworkCredential("login", "haslo");
Boolean UsePassive = true;
Boolean UseBinary = true;
request.Method = WebRequestMethods.Ftp.GetFileSize;
request.Proxy = null;
request.KeepAlive = true;
request.UsePassive = UsePassive;
request.UseBinary = UseBinary;
long fileSize;
using (WebResponse resp = request.GetResponse())
fileSize = resp.ContentLength;
request = (FtpWebRequest)WebRequest.Create("ftpserv" + name2);
request.Credentials = new NetworkCredential("login", "haslo");
using (FtpWebResponse responseFileDownload = (FtpWebResponse)request.GetResponse())
using (Stream responseStream = responseFileDownload.GetResponseStream())
using (FileStream writeStream = new FileStream(name2, FileMode.Create))
{
long length = responseFileDownload.ContentLength;
int Length = 2048;
Byte[] buffer = new Byte[2048];
int bytesRead = responseStream.Read(buffer, 0, Length);
int bytes = 0;
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = responseStream.Read(buffer, 0, Length);
bytes += bytesRead;
int totalSize = (int)(fileSize) / 1000; // Kbytes
BackgroungWorker.ReportProgress((bytes / 1000) * 100 / totalSize, totalSize);
}
responseFileDownload.Close();
writeStream.Close();
}
}
}
catch (Exception er )
{
MessageBox.Show("error" + er);
}
finally
{
_resetEvent.Set();
completed = true;
}
}
private void BackgroungWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Debug.WriteLine(e.ProgressPercentage * (int)e.UserState / 100 + " bytes / " + e.UserState + " bytes" + " % = " + e.ProgressPercentage);
lbProgress.Text = e.ProgressPercentage + " %";
LauncherPB.Value = e.ProgressPercentage;
V.Text = e.ProgressPercentage * (int)e.UserState / 100 + " bytes / " + e.UserState + " bytes";
}
private void BackgroungWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
MessageBox.Show("Download has been canceled.");
completed = false;
}
else
{
DownloadCompletedtxt.Visible = true;
completed = true;
}
Pomysł jest generalnie taki :
pobieram plik z ftp backgroundworkerem, nastepnie jezeli plik zostanie pobrany w 100% , co sprawdza while(!e.Canceled)
wówczas ustawiam flage i setuje autoresetEvent, jednak moj pobierany plik nigdy nie osiąga 100% , a 99% brakuje mu zazwyczaj kilkaset bajtow, przez co sciaga sie na okraglo od nowa, przejrzalem caly internet chyba i nie udalo mi sie nic sensownego znalezc, wiec stwierdzilem ze trzeba poprosic o pomoc :)
Z gory dziekuje.