Avatar billede neocron Nybegynder
06. august 2006 - 23:46 Der er 7 kommentarer og
1 løsning

Hentning af fil

Hej.
I forbindelse med et lille program jeg er ved at lave til at måle trafik vil jeg gerne have mit program til automatisk at hente en fil fra et forudbestemt domæne til et forudbestemt lokal folder.

Hvis vi antager at jeg har knappen "Start Test" skal den gøre følgende ved klik på knappen uden nogen form for bruger interaktion:

1. Start automatisk download af www.enellerandenside.dk/test/testfil.tst

2. Denne fil skal lagres i C:\test\

For at opsummere, så skal programmet automatisk hente filen fra en foruddefineret webadresse til en foruddefineret sti på brugeres computer. Dette skal ske ved et klik på knappen og intet andet.

Hvordan kan jeg gøre det?
Avatar billede arne_v Ekspert
07. august 2006 - 00:02 #1
(Http)WebRequest

eksempel:

using System;
using System.IO;
using System.Net;
using System.Web;

class MainClass
{
    public static void Main(string[] args)
    {
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://www.eksperten.dk/img/elogo.png");
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        string filename = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]) + "\\elogo.png";
        Stream f1 = resp.GetResponseStream();
        Stream f2 = new FileStream(filename, FileMode.CreateNew, FileAccess.Write);
        byte[] b = new byte[1000];
        int n;
        while((n = f1.Read(b, 0, b.Length)) > 0)
        {
            f2.Write(b, 0, n);
        }
        f2.Close();
        f1.Close();
        resp.Close();
    }
}
Avatar billede neocron Nybegynder
07. august 2006 - 00:39 #2
Fantastisk, det var lige det jeg manglede :)

Hvis det må være mig tilladt at komme med et tillægsspørgsmål, så er det som sagt til et program som måler trafik.

Jeg har en textBox (dataArray er dens navn) som den gemmer alt det som bliver genereret.

Dvs. at dataArray.Text kan se således ud (bemærk | til sidst i outputtet):

6,23|5,65|66,29|67,34|85,03|

Disse tal vil jeg så smide i et array for at kunne lægge disse sammen, men det giver mig problemer. Først og fremmest tror jeg ikke at den vil godkende andet end . ved sammenlægning af decimaltal (0.00 fremfor 0,00) så derfor har jeg fremkogt noget kode som ikke virker efter hensigten:

double processArray()
{
    double result = 0;
    string[] buffer = dataArray.Text.Split(@" ".ToCharArray());
    for (int i = 0; i < buffer.Length; i++)
    {
        result += Convert.ToDouble(buffer[i].ToString().Replace(@",", @"."));
    }
    return result;
}

Når den når til linien:

result += Convert.ToDouble(buffer[i].ToString().Replace(@",", @"."));

Dør den med en Exception:
FormatException was unhandled- Inputstrengen var ikke ie t korrekt format

Hvordan tryller jeg mig udenom denne? (husk også et svar for det originale spørgsmål)
Avatar billede neocron Nybegynder
07. august 2006 - 00:55 #3
Et andet problem - hvis filen som skal downloades er særlig stor (eks. 450kb) vil programmet simpelthen bare gå i selvsving indtil filen er downloadet. Det betyder at jeg ikke får lagret de data, som jeg skal bruge mens der downloades. Kan der gøres noget ved dette?

Jeg bruger lige nu en textbox til at se om der rent faktisk løber data ind, og der kommer ingen input i. Det er skidt, da textboxens data rent faktisk bruges til videre behandling af data.
Avatar billede arne_v Ekspert
07. august 2006 - 02:08 #4
det er et problem at downloade en stor fil i en event metode

overvej løsninger hvor event metode starter en tråd til at lave download
Avatar billede arne_v Ekspert
07. august 2006 - 02:11 #5
.Split(@"|".ToCharArray());

formoder jeg

.Replace(@",", @".")

er kun brugbart hvis din culture står til US

og hvis du får en tom streng til sidst kan du putte en if som tester på
længden inden i for løkkeb
Avatar billede arne_v Ekspert
07. august 2006 - 02:11 #6
og et svar
Avatar billede neocron Nybegynder
07. august 2006 - 18:42 #7
Ved du hvor jeg kan finde simple, men brugbare eksempler på det med Threads?
Det har jeg slet ikke eksperimenteret med.
Avatar billede arne_v Ekspert
07. august 2006 - 18:54 #8
threads er simple at bruge

threads sammen med Win forms er hm ikke helt simpelt

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