Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Datei Download mit Fortschritts Anzeige
CyberHunter
myCSharp.de - Member



Dabei seit:
Beiträge: 131
Herkunft: Österreich

Themenstarter:

Datei Download mit Fortschritts Anzeige

beantworten | zitieren | melden

Hallo zusammen,

Ich lade in meiner Anwendung auf Knopfdruck eine Datei von einer url Herunterladen.
Dies mache ich mit Hilfe der 'System.Net.WebClient' Klasse mit der Methode 'DownloadFile'

Gibt es eine möglichkeit dazu eine Fortschrittsanzeige zu realisieren bzw. wie wird sowas in der Regel umgesetzt?

Danke für eure Hilfe
CyberHunter
private Nachricht | Beiträge des Benutzers
WSX
myCSharp.de - Member



Dabei seit:
Beiträge: 32

beantworten | zitieren | melden

habs noch nie gemacht, deswegen weiss ich nicht ob es was vorgefertigtes gibt.

der Ansatz, von dem ich sicher bin, dass er funktionieren kann
größe der herunterzuladenden Datei am Server / größe temporären Datei am Client * 100
das ergibt deinen Fortschritt in Prozent,
und das wendest jetzt auf ne Progressbar an
"Arbeit ist die altmodische Form der Vermögensbildung in Arbeitnehmerhand."

Wolfram Weidner (*1925), dt. Journalist
private Nachricht | Beiträge des Benutzers
Arkaiden
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

Ich hab das so gelöst:

Größe der Datei / 100, damit bekommst du 1%schritte

und immer wenn du 1% runtergeladen hast, machst du
progressBar1.increment(GrößederDatei/100);

musst natürlich dafür wissen wieviel du schon runtergeladen hast und wie groß die datei insgesamt ist.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.773
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

Das gibts schon fertig in .NET 2.0.

Such nach "WebClient".

Datei im Hintergrund laden und Fortschritt in % anzeigen geht dann so :

WebClient client = new WebClient();
client.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
client.DownloadFileAsync(new Uri(url), zipfile);
...

private void DownloadProgressChanged(Object sender, DownloadProgressChangedEventArgs e)
{
	toolStripStatusLabel3.Text = "Download Update " + e.ProgressPercentage.ToString() + "%";
}

private void DownloadFileCompleted(Object sender, AsyncCompletedEventArgs e)
{
...
}

Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
Arkaiden
myCSharp.de - Member



Dabei seit:
Beiträge: 49

beantworten | zitieren | melden

gut zu wissen =))

und ich depp rechne das immer selbst aus!

Thx Bernd
private Nachricht | Beiträge des Benutzers
garden
myCSharp.de - Member



Dabei seit:
Beiträge: 28

beantworten | zitieren | melden

sry wenn ich den Thread hier nochmals hervorhole, ich weiss wie alt dieser ist.

Allerdings betrifft meine Frage genau die hier besprochene Sache.

Und zwar hätte ich auch gerne eine Fortschrittsanzeige beim download von Dateien, der WebClient hierfür ist erstellt, allerdings werden die Dateien in einem eigenen Thread heruntergeladen.

Das ist wahrscheinlich der Grund wieso die Funktion während des ganzen Downloads nicht reagiert.


        void DownloadClient_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            percentage_active_download.Text = "Download Update " + e.ProgressPercentage.ToString() + "%";
        }


Ich initialisiere den WebClient:


private WebClient DownloadClient = new WebClient();


und im Konstruktor nehme ich noch folgende Einstellungen vor:


            //Konfiguriert den DownloadClient
            DownloadClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

            DownloadClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadClient_DownloadProgressChanged);


Wie bereits gesagt Downloade ich nachher mittels eines Backgroundworkers (und WebClient) gewisse Dateien aus dem Internet, allerdings reagiert die Funktion "DownloadProgressChanged" nicht.


Könnt ihr mir vielleicht ein weiteres Vorgehen empfehlen?

Vielen Dank fürs Lesen

mfg - garden
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

Hi garden,

wenn du das in einen eigenen Thread ausgliederst dann musst du mit delegates arbeiten und per Invoke die Delegates aufrufen und dann mit Dateigröße den Prozentualen fortschritt übergeben. Ich hoffe es ist klar geworden was ich meine

Gruß Daniel
private Nachricht | Beiträge des Benutzers
garden
myCSharp.de - Member



Dabei seit:
Beiträge: 28

beantworten | zitieren | melden

k, verstehen tu ich es noch nicht, werde mich melden so bald ich das ganze begriffen und umgesetzt habe Vielen Dank!
private Nachricht | Beiträge des Benutzers
NeuroCoder
myCSharp.de - Member



Dabei seit:
Beiträge: 335
Herkunft: NRW

beantworten | zitieren | melden

Hallo garden,

Was Kaji dir beschrieben hat, gibt es in diesem FAQ-Eintrag von herbivore schön erklärt:
[FAQ] Warum blockiert mein GUI?

Mfg NeuroCoder
private Nachricht | Beiträge des Benutzers
DragothiX
myCSharp.de - Member



Dabei seit:
Beiträge: 7

beantworten | zitieren | melden

Ich habe auch mal eine Frage dazu:
Auch wenn das der eigentlichen Idee des asynchronen Down-/Uploads widerspricht würde ich gerne folgendes machen:

Während des Transfervorgangs eine Statusbar anzeigen (das funktioniert wie beschrieben) aber während des Downloads KEINEN weiteren Code ausführen, denn das macht in meinem Programm erst nach beendetem Down-/Upload Sinn.

Ich könnte die Datei natürlich auch synchron transferieren aber dann blockiert die GUI und ich kann keinen Fortschritt anzeigen lassen.

Hat da jemand eine Idee?
private Nachricht | Beiträge des Benutzers
Xynratron
myCSharp.de - Member



Dabei seit:
Beiträge: 1.177

beantworten | zitieren | melden

Zitat von DragothiX
Während des Transfervorgangs eine Statusbar anzeigen [..] aber während des Downloads KEINEN weiteren Code ausführen

Also, prinzipiell widerspricht sich das ein wenig, da ja jeder refresh deiner Gui Code ausführt.

Die einzige Möglichkeit welche mir da einfällt ist alle Eingabemöglichkeiten für den User verbieten. Also alle Buttons, Eingabefelder usw. auf disabled stellen. Ansonsten würde dein Benutzer ja auch das Fenster nicht minimieren können, bzw. den Download abbrechen dürfen.

:-)

Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Zitat von herbivore
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
private Nachricht | Beiträge des Benutzers
joberschweiber
myCSharp.de - Member



Dabei seit:
Beiträge: 12

beantworten | zitieren | melden

Hallo,

wenn Ich mich recht erinnere, musst du die DownloadFileAsync-Methode des WebClient benutzen, damit das DownloadProgressChanged-Event ausgelöst wird. Hierbei wird der aufrufende Thread auch nicht blockiert.
private Nachricht | Beiträge des Benutzers