Avatar billede styrk Nybegynder
05. januar 2006 - 20:25 Der er 33 kommentarer og
1 løsning

Download special fil og placer den et specielt sted

Hejsa,

Jeg har prøvet at søge lidt men synes ikke jeg kunne bruge det jeg fand til noget (jeg er ny til C#). Men jeg er igang med at lave et script som kan downloade en fil fra en given url til en given placering på en client.

Lige umiddelbart er jeg lidt på bar bund så det ville være lækkert hvis en eller anden kunne give mig et forslag til hvordan jeg gør:

Download fil A,
Til destination B.

Det jeg skal bruge er de par linier som gør selve magien, jeg behøves i et helt projekt/script :]

Og ! Er det muligt at downloade en HEL mappe (+ undermapper osv) ??

- Styrk.
Avatar billede arne_v Ekspert
05. januar 2006 - 20:27 #1
selve download er nem:

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
        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 arne_v Ekspert
05. januar 2006 - 20:28 #2
der er ingen standard måde at downloade en hel mappe på

(hvis der er en index.noget så kan man slet ikke få en liste
over mappens indhold)
Avatar billede styrk Nybegynder
05. januar 2006 - 20:33 #3
Hejsa, Tak!

Men hvor angiver jeg fil url og hvor angiver jeg hvor selve filen skal placeres?
Avatar billede styrk Nybegynder
05. januar 2006 - 20:34 #4
og hvad hvis den ikke kan få forbindelse til serveren/eller at filen ikke findes?..

tak igen :]
Avatar billede Syska Mester
05. januar 2006 - 20:37 #5
url er link
og
filename er destination
er jeg ret sikker på arne_v mener

// ouT
Avatar billede styrk Nybegynder
05. januar 2006 - 20:38 #6
og en sidste ting :D

Hvordan kan man loope igennem en given fil på nettet for linier sådan at man får en linie adgangen, tak :D
Avatar billede arne_v Ekspert
05. januar 2006 - 20:43 #7
det er rigtigt
Avatar billede arne_v Ekspert
05. januar 2006 - 20:43 #8
fejl giver en exception
Avatar billede arne_v Ekspert
05. januar 2006 - 20:43 #9
Hvis du vil læse linier så wrapper du den Stream i en StreamReader
Avatar billede styrk Nybegynder
05. januar 2006 - 20:45 #10
Okey tak - ja der er rimelig mange errors i det du gav mig, den kan ikke finde funktioner.

Jeg har prøvet at tilføje System.Net. til nogle af dem hvilket retter det men der er stadig nogle jeg ikke kan få kringlet helt..
Avatar billede styrk Nybegynder
05. januar 2006 - 20:46 #11
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(FileURL);
            System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)req.GetResponse();
            Stream f1 = resp.GetResponseStream();
            Stream f2 = new FileStream(localDestination, 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();

er hhvad jeg har nu..
Avatar billede arne_v Ekspert
05. januar 2006 - 20:52 #12
using System;
using System.IO;
using System.Net;
using System.Web;
Avatar billede styrk Nybegynder
05. januar 2006 - 21:07 #13
Takker ! Jeg leger lige med det :]
Avatar billede styrk Nybegynder
05. januar 2006 - 22:47 #14
Jeg får en fejl: The given path's format is not suported.

Hvad kan jeg gøre for at fikse dette?
Avatar billede arne_v Ekspert
05. januar 2006 - 22:54 #15
hvordan ser url og filename ud ?
Avatar billede 3ddd Nybegynder
05. januar 2006 - 22:56 #16
Har du husket at skrive stien på følgende måde?
string path = @"dir\dir\dir"
eller
string path = "dir\\dir\\dir"
?
Avatar billede styrk Nybegynder
05. januar 2006 - 23:10 #17
Jeg fandt ud af det, min lokale placering var lidt forkert :]

Det virker nu, 1000tak - smid lige et svar arne_v..
Avatar billede arne_v Ekspert
05. januar 2006 - 23:11 #18
svar
Avatar billede styrk Nybegynder
06. januar 2006 - 00:12 #19
Programmet virker som det skal nu men det står og 'hænger' når man henter filerne, nogle gange går programmet ud i 'svare ikke' mode - man kan dog bare vente til programmet engang er færdigt med at hente de forskellige filer og det køre fint videre.

Er der en måde at fikse dette på?
Avatar billede Syska Mester
06. januar 2006 - 00:18 #20
Ja, køre din download i en anden tråd/process
Avatar billede arne_v Ekspert
06. januar 2006 - 00:25 #21
du må ihvertfald ikke køre koden i en windows form click kode
Avatar billede arne_v Ekspert
06. januar 2006 - 00:27 #22
her er et eksempel med den berømte/berygtede progress bar (url og filename
er harcoded i eksemplet):

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 styrk Nybegynder
06. januar 2006 - 00:29 #23
Jeg har faktisk lavet min egen progress bar osv som virker fint det er bare at den nemt kommer til at hænge..

Jeg ved dog ikke om det er fordi at jeg køre programmet direkte fra Virsual Studio C# (hvilket er debug mode?)..
Avatar billede Syska Mester
06. januar 2006 - 00:32 #24
Ja, du starter den "hente-process" i din main tråd vil resten af programmet selvfølgelig hænge da den først skal være færdig med det før den kan begynde at regne på anden.... så derfor kan det ikke lade sig gøre.... brug Arne_v's eksemple

// ouT
Avatar billede styrk Nybegynder
06. januar 2006 - 00:42 #25
Hvis jeg nu flyttede min source over i en ny class ville det hjælpe på problemet? Altså flytte den ud af min main class...
Avatar billede Syska Mester
06. januar 2006 - 00:55 #26
Nej, for det er stadig din "main-tråd" der kører alt i dit program......

1 tråd == 1 process af gangen...... altså der kan kun ske 1 ting af gangen

flere tråde == flere ting kan ske på en gang

Og CPU kan så selv finde ud af at skifte mellem alle de forskellige processer... ligesom windows gør....

// ouT
Avatar billede styrk Nybegynder
06. januar 2006 - 00:59 #27
Okey, hvordan ville jeg få koden til at køre min funktion UpdateFiles() som en anden tråd?
Avatar billede styrk Nybegynder
06. januar 2006 - 01:03 #28
Jeg har to filer, MainForm:
----------------------------------------

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Q4PickupUpdater
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
       
        private void MainForm_Load(object sender, EventArgs e)
        {
            //distinationTextBox.Text = "C:\\";

            distinationTextBox.Text = "C:\\Programmer\\id Software\\Quake 4";
           
        }

        // Private Toolstrip Button Events
        private void ChooseDir_Click_1(object sender, EventArgs e)
        {
            folderBrowserDialog1.ShowDialog();

            string result = folderBrowserDialog1.SelectedPath;
           
            if (result.Length > 0)
                distinationTextBox.Text = result; StartUpdater.Enabled = true;
        }

        private void CloseMain_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void StartUpdater_Click(object sender, EventArgs e)
        {
            try
            {
                UpdateFiles();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Problem executing, error: " + ex.Message);
            }

            StartUpdater.Enabled = false;
        }

      private void visitHomepageToolStripMenuItem_Click(object sender, EventArgs e)
      {
            try
            {
                System.Diagnostics.Process.Start("IExplore", "http://q4pickup.com");
            }
            catch (Exception ex)
            {
                MessageBox.Show("Could not launch Internet Explorer.",
                    "An error has occurred",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
        }

        private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AboutDialog myAbout = new AboutDialog();

            myAbout.ShowDialog();
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void editSourcesToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SourcesDialog mySourcesDialog = new SourcesDialog();

            mySourcesDialog.ShowDialog();
        }

        // Helper methods
        private void UpdateFiles()
        {
            string fileList = "http://files.q4pickup.dk/updater/index.xml";

            statusLabel.Text = "Updating files ...";

            try
            {
                System.Collections.ArrayList result;
                result = FetchFileList.ProcessFileFeed(fileList);

                progressBar1.Maximum = result.Count;
                progressBar1.Value = 0;

                int i = 0;
                foreach (Q4PickupUpdater.FileItem currentFileItem in result)
                {
                    currentFileLabel.Text = currentFileItem.File;

                    string path = distinationTextBox.Text + "\\" + currentFileItem.Dir + "\\" + currentFileItem.File;
                    string dirpath = distinationTextBox.Text + "\\" + currentFileItem.Dir;

                    // Check if file already exists, if not then go ahead
                    if (!System.IO.File.Exists(path))
                    {
                        //MessageBox.Show("Download file" + currentFileItem.File + " to dir " + currentFileItem.Dir + " test: " + System.IO.Directory.Exists(currentFileItem.Dir.ToString()));

                        // Check if directory exists, if not then create
                        if (!System.IO.Directory.Exists(dirpath))
                        {
                            System.IO.Directory.CreateDirectory(dirpath);
                            MessageBox.Show("Created one folder!");
                        }

                        // And finally, download the file.
                        FileDownloader.DownloadFile(currentFileItem.Dest, path);
                        //MessageBox.Show(currentFileItem.Dir);
                        statusLabel.Text = "Downloaded " + i + " file of " + progressBar1.Maximum + " file(s)";

                        i++;
                    }
                    progressBar1.Value++;
                }

                if (i > 0)
                {
                    statusLabel.Text = i + " file(s) were downloaded.";
                }
                else
                {
                    statusLabel.Text = "No files were downloaded.";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                //progressBar1.Value = 0;
                currentFileLabel.Text = "Done.";
            }
        }
    }
}





FileDownloader.cs
----------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Text;

namespace Q4PickupUpdater
{
    class FileItem
    {
        private string _file;
        private string _dir;
        private string _dest;

        public string File
        {
            get { return _file; }
            set { _file = value; }
        }

        public string Dir
        {
            get { return _dir; }
            set { _dir = value; }
        }

        public string Dest
        {
            get { return _dest; }
            set { _dest = value; }
        }

    }

    class FetchFileList
    {
        public static System.Collections.ArrayList ProcessFileFeed(string fileListURL)
        {
            // Begin the WebRequest to the desired RSS Feed
            System.Net.WebRequest myRequest = System.Net.WebRequest.Create(fileListURL);
            System.Net.WebResponse myResponse = myRequest.GetResponse();

            // Convert the RSS Feed into an XML document
            System.IO.Stream rssStream = myResponse.GetResponseStream();
            System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();

            rssDoc.Load(rssStream);

            // This uses an XPath expression to get all nodes that fall
            // under this path.
            System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item");

            // Loop through the Item nodes from the RSS Feed and retrieve
            // the Title, Link and Description.  Then we'll add it to the
            // database (if not already present.)

            System.Collections.ArrayList returnArrayList = new System.Collections.ArrayList();

            for (int i = 0; i < rssItems.Count; i++)
            {
                System.Xml.XmlNode rssDetail;

                FileItem tempFileItem = new FileItem();

                rssDetail = rssItems.Item(i).SelectSingleNode("file");
                if (rssDetail != null)
                {
                    tempFileItem.File = rssDetail.InnerText;
                }
                else
                {
                    tempFileItem.File = "";
                }

                rssDetail = rssItems.Item(i).SelectSingleNode("dir");
                if (rssDetail != null)
                {
                    tempFileItem.Dir = rssDetail.InnerText;
                }
                else
                {
                    tempFileItem.Dir = "";
                }

                rssDetail = rssItems.Item(i).SelectSingleNode("dest");
                if (rssDetail != null)
                {
                    tempFileItem.Dest = rssDetail.InnerText;
                }
                else
                {
                    tempFileItem.Dest = "";
                }

                returnArrayList.Add(tempFileItem);
            }
            return returnArrayList;
        }

    }

    class FileDownloader
    {
        public static void DownloadFile(string FileURL, string LocalDestination)
        {
            // TODO: Need to add some error handlers, like when 'file not found' or 'server down'.
            System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(FileURL);
            System.Net.HttpWebResponse resp = (System.Net.HttpWebResponse)req.GetResponse();
            System.IO.Stream f1 = resp.GetResponseStream();
            System.IO.Stream f2 = new System.IO.FileStream(LocalDestination, System.IO.FileMode.CreateNew, System.IO.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();
        }
    }
}

------------------------------------------------
- kan du give mig et hint? :]
Avatar billede Syska Mester
06. januar 2006 - 01:04 #29
Jamen, den kode Arne_v har postet sidst kører det i en Tread..... prøv at brug den.

// ouT
Avatar billede styrk Nybegynder
06. januar 2006 - 01:09 #30
Jo men jeg er I tvilv om hvad af hans jeg skal bruge og i så fald hvor.
Avatar billede Syska Mester
06. januar 2006 - 01:46 #31
start et nyt projekt og leg med det...... bedste måde man kan lære noget nyt på.

Hvis man alligevel ikke helt forstår hvad der sker og hvorfor, synes jeg personligt at det er kedeligt at kode, hvis det hele bare bliver til klikke klister af hvad andre har lavet.......

// ouT
Avatar billede styrk Nybegynder
06. januar 2006 - 01:54 #32
Jeg forstår fint hvad der sker i min egen kode men hans er lidt ud over mine grænser pt - og hvis det alligevel kun er en mindre ændring så ville det da være lækkert :]

Kan det tænkes at der kun skal pilles ved funktionen DownloadFile?
Avatar billede Syska Mester
06. januar 2006 - 01:58 #33
har kun meget kort set hans koden, og slet ikke din... ikke noget jeg lige gider sætte mig ind i for at kunne sige det..... skal til at i seng, kommer en tømmer om 5½ time og vækker mig.

// ouT
Avatar billede styrk Nybegynder
06. januar 2006 - 02:05 #34
Hehe bare fin du :D
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