Pobieranie pliku z ftp nigdy nie osiaga 100%

0

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.

0

Spróbuj za:

responseFileDownload.Close();
writeStream.Close();

wrzucić linijkę:

BackgroungWorker.ReportProgress(100);

Być może byłoby to nawet warto wrzucić za wszystkimi using, chodzi o to, że nigdy nie wyliczysz tego dokładnie dlatego warto na koniec na "sztuczno" wrzucić 100%.

0

Niestety to nie pomogło, zrobiłem to inaczej :

Stworzyłem liste Backgroundworkerow

 
private IList<BackgroundWorker> BGworkersWithData = new List<BackgroundWorker>();

Robie cos takiego :

BGworkersWithData.Add(BackgroungWorker); // dodaje workera ktorego bede uzywal do listy
BackgroungWorker.RunWorkerAsync(); // wywoluje go
CheckAllThreadsHaveFinishedWorking(); // meta ktora czeka az worker zakonczy dzialanie, wowczas czysci liste.

private void CheckAllThreadsHaveFinishedWorking() // bierze wszystkie dodane workery do isty i sprawdza czy wszystkie watki zostaly zakonczone.
        {
            bool hasAllThreadsFinished = false;
            while (!hasAllThreadsFinished)
            {
                hasAllThreadsFinished = (from worker in BGworkersWithData
                                         where worker.IsBusy
                                         select worker).ToList().Count == 0;
                Application.DoEvents(); //to jest potrzebne do progress bara zeby updatowalo go
                Thread.Sleep(100);     //tutaj jest ile ma czekac od kazdego odswiezenia stanu w % odnosnie pliku ktory jest pobierany
            }
            BGworkersWithData.Clear();  // po zakonczeniu czysci dane z wszystkich bg aby zwolnic pamiec
        } 

znalezione gdzies na necie :]

1

OK, super że działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1