WebClient i status pobierania

0

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);
0

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.

3
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?

0

Chodzi mi o komponent, np.

ListView.Items[i].Text

I właśnie muszę przekazać ten parametr i.

0

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...

0

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.

1

DownloadFileAsync i obsłuż event ProgressChanged

0

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.)

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