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.
musisz wiedziec jaki jest calkowity rozmiar pliku, a po przeczytaniu jakiegos bloku danych obliczyc ile juz masz i odpowiednio przesunac progress bar
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ź?
A jak go (ten plik) odbierasz?
Nie wiem dokładnie o co Ci chodzi więc odpowiem na dwa sposoby.
-
Program "odbiera" ścieżkę do pliku od użytkownika przez OpenFileDialog i przy pomocy odpowiedniej metody go wysyła.
-
A ja pobieram plik z serwera FTP przy pomocy Total Commandera...
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?
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:
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.
Nikt nie zna odpowiedzi?
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();
}
Dzięki, popróbuję.