Wysyłanie FTP - postęp

0

Jak mogę uzyskać procentowy postęp wysyłania pliku przez FTP? Wysyłane będą pliki graficzne 500KB-5MB. Po prostu jak wchodzi nowy procent, to żeby go automatycznie dostać. Wystarczy postęp, bez ProgressBar'a.

0

musisz wiedziec jaki jest calkowity rozmiar pliku, a po przeczytaniu jakiegos bloku danych obliczyc ile juz masz i odpowiednio przesunac progress bar

0

Tyle to ja wiem i sam. Prosiłem o konkrety, szczególnie o odczytanie rozmiaru pliku i o te wysyłanie "pakietowe" bo tyle wyczytałem na googlach, ale nie dotyczyło to FTP.

blazej30 napisał(a)

Wystarczy postęp, bez ProgressBar'a.

massther napisał(a)

odpowiednio przesunac progress bar

Przeczytałeś w ogóle moją wypowiedź?

1

A jak go (ten plik) odbierasz?

0

Nie wiem dokładnie o co Ci chodzi więc odpowiem na dwa sposoby.

  1. Program "odbiera" ścieżkę do pliku od użytkownika przez OpenFileDialog i przy pomocy odpowiedniej metody go wysyła.

  2. A ja pobieram plik z serwera FTP przy pomocy Total Commandera...

0

a ja wysylam kuriera z koperta do serwerowni, a tam technik przepisuje bity z kartki :D

ja tam dalej nie wiem o co ci chodzi?

Masz program, ktory wskazany plik wysyla na ftp. Chcesz zeby jak wysle sie kolejny procent pliku, to zebyc zlapal ta informacje.
Co to za program? W .net napisany? Masz zrodla, ktore mozesz modyfikowac? Czy chcesz to uzyskac z dowolnego programu, np. Total commander?

0

Dział dotyczy C# i .NET więc chyba jasne, że program jest w C#. Dobra masz, roztłumaczę Ci to tak, że jakby nie patrzył będziesz musiał się połapać.

Mniejsza o to do czego program. Mam tam formę do zgłaszania błędów, która wygląda tak:

user image

Po kliknięciu przeglądaj otwiera się OpenFileDialog. Po wybraniu pliku graficznego(screena) ścieżka zostaje wpisana w odpowiednie miejsce. Niektórzy dość nieumiejętnie zapisują screeny, przez co mają one spore rozmiary. A nawet jeśli będzie mały, ktoś może mieć wolniejsze łącze, a nawet przy 1Mb\s ADSL wysyłanie takiego 1,2MB screena zajmuje 30-60 sekund. A już dwa razy przez to użytkownik uznał, że program się zawiesił i pisał mi gdzie indziej. Wracając do funkcjonowania, program po kliknięciu Wyślij wykonuje następujący kod:

this.Enabled = false;
button2.Text = "Trwa wysyłanie..." - i tu właśnie chciałbym dodać po kropkach wartość procentową.
Random random = new Random();
int randomInt = random.Next(1, 2000000);
(...)tu zapisuję dane z kontrolek do osobnego pliku, jednak on ma 1KB, więc podczas liczenia tych procentów nie musi być brany pod uwagę, ominąłem go aby było szybciej.

            FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://serwer.pl + "/errors/" + "errorRaport_" + rejestrKalkulatora.GetValue("UserName") + randomInt +".dtbs");

            request.Method = WebRequestMethods.Ftp.UploadFile;
            request.Credentials = new NetworkCredential("nazwa użytkownika", "hasło logowania");
            request.UsePassive = true;
            request.UseBinary = true;
            request.KeepAlive = false;

            //Load the file
            FileStream stream = File.OpenRead(Path.GetTempPath() + @"\errorRaport_" + userName + randomInt + ".dtbs");
            byte[] buffer = new byte[stream.Length];

            stream.Read(buffer, 0, buffer.Length);
            stream.Close();

            //Upload file
            Stream reqStream = request.GetRequestStream();
            reqStream.Write(buffer, 0, buffer.Length);
            reqStream.Close();

            File.Delete(Path.GetTempPath() + @"\errorRaport_" + userName + randomInt + ".dtbs");

            FtpWebRequest request2 = (FtpWebRequest)FtpWebRequest.Create("ftp://serwer.pl" + "/errors/" + "errorRaportScreen_" + rejestrKalkulatora.GetValue("UserName") + randomInt + "." + Path.GetExtension(openFileDialog1.FileName));

            request2.Method = WebRequestMethods.Ftp.UploadFile;
            request2.Credentials = new NetworkCredential("nazwa", "hasło");
            request2.UsePassive = true;
            request2.UseBinary = true;
            request2.KeepAlive = false;

            //Load the file
            FileStream stream2 = File.OpenRead(textBox1.Text);
            byte[] buffer2 = new byte[stream2.Length];

            stream2.Read(buffer2, 0, buffer2.Length);
            stream2.Close();

            //Upload file
            Stream reqStream2 = request2.GetRequestStream();
            reqStream2.Write(buffer2, 0, buffer2.Length);
            reqStream2.Close();
            MessageBox.Show("Wiadomość o błędzie została wysłana. W ciągu 48 godzin pojawi się aktualizacja.", "Wysłano");

Podsumowując, wysyłam plik graficzny i chcę postęp jego wysyłania umieścić w tekście przycisku.

0

Nikt nie zna odpowiedzi?

0

Nie ładuj całego pliku do bufora albo nie wysyłaj go na raz. Zrób sobie mniejszy bufor i wysyłaj w kawałkach, pomiędzy nimi sprawdzaj ile już wysłałeś i jakim procentem pliku jest ilość danych już wysłanych. Kod znaleziony "na szybko" w sieci:

int bufferLength = 2048; 
byte[] buffer = new byte[bufferLength]; 
int contentLen; 
FileStream fs = fi.OpenRead(); 
try 
{ 
     Stream s = req.GetRequestStream(); 
     contentLen = fs.Read(buffer, 0, bufferLength); 
     while (contentLen != 0) 
     { 
          s.Write(buffer, 0, contentLen); 
          contentLen = fs.Read(buffer, 0, bufferLength); 
          //Tutaj sprawdzasz ile już wysłałeś pliku i raportujesz postęp
     } 
     s.Close(); 
} 
0

Dzięki, popróbuję.

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