Laden...

Programm Accessable bei Ausführung

Erstellt von Maddinel vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.279 Views
Maddinel Themenstarter:in
1.371 Beiträge seit 2004
vor 19 Jahren
Programm Accessable bei Ausführung

Hi,
ich lade in einem Updateprogramm folgenbdermaßen eine Datei aus dem Internet:


WebClient wClient = new WebClient();
wClient.Download(...

Naja oder so ähnlich,das klappt auf jeden Fall.
Jetzt meine Frage dazu. Ich würde gerne mit einem ProgressBar den Fortschritt des Dateidownloads anzeigen und das Programm soll sich graphisch weiterhin aktualisieren und bewegbar sein. Das tut es momentan leider nicht.
Wie bekomme ich das hin?

==============================
Wenn ichs wüsst', würd' ich nicht fragen!!! 😁
==============================

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Maddinel,

sieht nicht so aus, als ob in WebClient irgendwas zum Aktualsieren eine Statusbar vorgesehen ist.

Das blockieren der Anwendung verhinderst du dadurch, dass du den Download-Code in einen Thread auslagerst. Wie das geht, ist in diesem Forum bestimmt schon an anderer Stelle beschrieben.

HTH

herbivore

_
416 Beiträge seit 2005
vor 19 Jahren

Hi

intressante Frage. Und weil man sowas ja eigentlich immer mal gebrauchen kann hab ich mich auch mal dran probiert.

Das kam raus und funktioniert recht gut 8)

	public static void DownloadFile(string URL, string Filename, ProgressBar progress)
{
	WebClient cli = new WebClient();
	Stream fDnld = null, fOut = null;

	try 
	{
		fDnld = cli.OpenRead(URL);
		string sTotal = cli.ResponseHeaders["Content-Length"];
		int nTotal = (sTotal==null || sTotal.Length==0) ? 0 : Convert.ToInt32(sTotal);
		if (progress!=null) 
		{ 
			progress.Minimum = 0;
			progress.Maximum = nTotal;
			progress.Value = 0;
		}

		fOut = File.Create(Filename);
		byte[] buf = new byte[4096];
		int nBytesRead;
		while ((nBytesRead = fDnld.Read(buf, 0, buf.Length)) > 0)
		{
			if (progress!=null) progress.Value += nBytesRead;
			fOut.Write(buf, 0, nBytesRead);
			Application.DoEvents();
		}
	} 
	catch{ throw; }
	finally 
	{
		if (fDnld!=null) fDnld.Close();
		if (fOut!=null) fOut.Close();
	}
}

Einziger Wermutstropfen. Das ganze funktioniert nur nicht mit 100%ig allen Webservern. Nur mit denen, die den Content-Length Header zurücksenden. Das sollten aber zumindest die gängigsten Server alla Apache, IIS, etc