Witam,
W jaki sposób wyświetlać informacje, np. w TextBox o statusie pobierania - czyli ile pobrano z ilu?
WebClient wc = new WebClient();
wc.DownloadFile(zrodlo, @sciezka + plik);
Witam,
W jaki sposób wyświetlać informacje, np. w TextBox o statusie pobierania - czyli ile pobrano z ilu?
WebClient wc = new WebClient();
wc.DownloadFile(zrodlo, @sciezka + plik);
Witam ponownie,
Doszedłem do takiego kodu:
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
e.ProgressPercentage.ToString();
}
Jednak nie mogę określić do jakiego miejsca ma zwracać procent pobranego pliku. W jaki sposób przekazać dodatkowy parametr w tej metodzie i jak ją w taki sposób zadeklarować? Chodzi mi o zwykłego** int'a**.
Mariooiooo napisał(a):
Jednak nie mogę określić do jakiego miejsca ma zwracać procent pobranego pliku.
Pisząc "miejsce" chodzi Ci o bar mleczny w Łomży?
Chodzi mi o komponent, np.
ListView.Items[i].Text
I właśnie muszę przekazać ten parametr i.
A po co chcesz to zrobić? Moim zdaniem coś źle przemyślałeś, skoro chcesz tak robić. Napisz dokładnie, co chcesz osiągnąć, bo najpierw pisałeś o TextBoxie, teraz o ListView...
W programie będzie kilka wątków, które w tym samym czasie będą pobierać pliki.
I po prostu chcę informować użytkownika o aktualnym statusie pobierania.
Wszystkie informacje czyli nazwa pliku i procent jego pobrania przechowywane są w listview.
DownloadFileAsync i obsłuż event ProgressChanged
Zamiast pisać strukturalnie i przekazywać magiczne indeksy z funkcji do funkcji, zrobiłbym klasę, która zawierałaby w sobie ListViewItem
oraz WebClient
wraz z obsługą jego zdarzeń. Np. tak:
class DownloadItem : IDisposable
{
private const string DownloadDirectoryPath = @"D:\Porno";
private string url, fileName;
private WebClient webClient;
public ListViewItem ListViewItem { get; private set; }
public DownloadItem(string url)
{
this.url = url;
this.webClient = new WebClient();
this.webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(WebClient_DownloadProgressChanged);
this.webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(WebClient_DownloadFileCompleted);
this.fileName = Path.GetFileName(url);
this.ListViewItem = new ListViewItem(fileName);
}
public void Start()
{
this.webClient.DownloadFileAsync(new Uri(this.url), Path.Combine(DownloadDirectoryPath, fileName));
}
void WebClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
this.ListViewItem.Text = string.Format("{0} | {1}%", this.fileName, e.ProgressPercentage);
}
void WebClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
this.ListViewItem.Remove();
}
public void Dispose()
{
this.webClient.Dispose();
}
}
Można jej potem łatwo użyć, np tak.:
private void btnStart_Click(object sender, EventArgs e)
{
this.DownloadItems.Add(new DownloadItem(@"http://storage.dobreprogramy.pl/akcesoria/7z920-x64(dobreprogramy.pl).msi"));
this.DownloadItems.Add(new DownloadItem(@"http://downloads.sourceforge.net/project/openofficeorg.mirror/stable/3.4.0/Apache_OpenOffice_incubating_3.4.0_Win_x86_install_en-US.exe"));
this.DownloadItems.Add(new DownloadItem(@"http://download.documentfoundation.org/libreoffice/stable/3.5.4/win/x86/LibO_3.5.4_Win_x86_install_multi.msi"));
this.DownloadItems.ForEach(q => this.lvDownloads.Items.Add(q.ListViewItem));
this.DownloadItems.ForEach(q => q.Start());
}
(DownloadItems to oczywiście lista.)