Avatar billede droa Novice
29. juni 2009 - 15:54 Der er 10 kommentarer og
1 løsning

Downloade filer i C#

Jeg har ikke rigtigt kunne finde noget om det, tror bare jeg er dårlig til og søge med stikord, men hvordan downloader man en fil fra nettet, til en lokal mappe, med HTTP protokol?

f.eks vis jeg har en fil, (på mit fiktive site)

http://www.test.dk/xmlfil1.xml
http://www.test.dk/xmlfil2.xml

jeg gerne vil have ned i lokalmappen hvor mit program ligger.

hvordan gør man det lettest?
Avatar billede arne_v Ekspert
29. juni 2009 - 16:06 #1
WebClient klassen
Avatar billede arne_v Ekspert
29. juni 2009 - 16:08 #2
WebClient wc = new WebClient();
wc.DownloadFile(url, fnm);
Avatar billede droa Novice
29. juni 2009 - 16:13 #3
jeg takker mange gange, hvordan kan man tjekke status på filen?

vis man nu har nogen større filer?

Størrelse
hvor meget af filen, der er hentet

og sådan noget?
Avatar billede arne_v Ekspert
29. juni 2009 - 16:24 #4
Jeg mener bestemt at det er et blocking kald d.v.s. at DownloadFile foerst returnmerer naar filen er downloaded.
Avatar billede droa Novice
29. juni 2009 - 16:27 #5
så der er ingen måde man kan lave en fancy procentbar, men hvor langt den er kommet?
Avatar billede arne_v Ekspert
29. juni 2009 - 16:28 #6
Saa skal du skifte fra WebClient til (Http)WebRequest !
Avatar billede arne_v Ekspert
29. juni 2009 - 16:29 #7
Et gammelt eksempel:

using System;
using System.Drawing;
using System.IO;
using System.Net;
using System.Windows.Forms;
using System.Threading;

public class MainForm : Form
{
    private ProgressBar bar;
    private Button start;
    private Button abort;
    private Thread t;
    public MainForm()
    {
        bar = new ProgressBar();
        start = new Button();
        abort = new Button();
        SuspendLayout();
        bar.Location = new Point(50, 50);
        bar.Size = new Size(200, 50);
        bar.Name = "Progress Bar";
        start.Location = new Point(50,150);
        start.Size = new Size(200, 50);
        start.Name = "Start Button";
        start.Text = "Start";
        start.Click += new EventHandler(StartClick);
        abort.Location = new Point(50,250);
        abort.Size = new Size(200, 50);
        abort.Name = "Abort Button";
        abort.Text = "Abort";
        abort.Click += new EventHandler(AbortClick);
        ClientSize = new Size(300, 350);
        Controls.Add(bar);
        Controls.Add(start);
        Controls.Add(abort);
        Name = "Main Form";
        Text = "Main Form";
        ResumeLayout(false);
    }
    void Reset(int n)
    {
        bar.Minimum = 0;
        bar.Maximum = n;
        bar.Value = 0;
    }
    void Update(int n)
    {
        bar.Value = n;
    }
    delegate void ResetHandler(int n);
    delegate void UpdateHandler(int n);
    void Copy()
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.tmk.com/ftp/vms-freeware/fileserv/unzip.zip");
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        int tot = (int)resp.ContentLength;
        if(bar.InvokeRequired)
        {
            bar.Invoke(new ResetHandler(Reset), new object[] { tot });
        }
        else
        {
            Reset(tot);
        }
        Stream f1 = resp.GetResponseStream();
        Stream f2 = new FileStream(@"C:\unzip.zip", FileMode.CreateNew, FileAccess.Write);
        int sofar = 0;
        byte[] b = new byte[1000];
        int n;
        while((n = f1.Read(b, 0, b.Length)) > 0 )
        {
            f2.Write(b, 0, n);
            sofar += n;
            if(bar.InvokeRequired)
            {
                bar.Invoke(new UpdateHandler(Update), new object[] { sofar });
            }
            else
            {
                Update(sofar);
            }
        }
        f2.Close();
        f1.Close();
        resp.Close();
    }
    void StartClick(object sender, EventArgs e)
    {
        t = new Thread(new ThreadStart(Copy));
        t.Start();
    }
    void AbortClick(object sender, EventArgs e)
    {
        t.Abort();         
    }
    [STAThread]
    public static void Main(string[] args)
    {
        Application.Run(new MainForm());
        Application.Exit();
        Environment.Exit(0);
    }
}
Avatar billede droa Novice
29. juni 2009 - 16:34 #8
nu hader jeg invokes, har aldrig fået det til og virker, så prøver altid om komme udenom, man vel os stadig? bare ved og lave en metode der returnere sofar, og henter den fra formen? med en timer?
Avatar billede arne_v Ekspert
29. juni 2009 - 17:02 #9
Hvis du vil opdatere en win forms GUI mens download sker, saa mener jeg at du skal bruge Invoke.

Eksemplet ovenfor virker.
Avatar billede droa Novice
29. juni 2009 - 17:06 #10
jeg takker igen, utrolig mange gange for din hjælp arne :) ligger du et svar?
Avatar billede arne_v Ekspert
29. juni 2009 - 17:21 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester