Avatar
RainbowShaggy:

Zdravim,
tak píši zase. Potřeboval bych pomoct s Asynchronním stahováním. Potřeboval bych script upravit tak aby:

  1. Zobrazoval ty toolStripStatusy, protože vždycky při stahování se zobrazí jen ten první a další jako by nebyly.
  2. Potřeboval bych upravit aby se dalo nastavit, že každý soubor, který to stáhne tak uloží do jiného adresáře.
  3. A potřeboval se zeptat jestli když pod to přidám podmínku pro zaškrtnutý checkBox že to stáhne jen když bude zaškrtnutý nebo se to bude muset taky nějak upravit.
  4. A poslední věc, že ukazatel by zobrazoval celkový průběh do konce, ne jak teď to zobrazuje průběh do konce každého souboru.

Zde přikládám kód:

        private void Button1_Click(object sender, EventArgs e)
{

    {
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

        toolStripStatusLabel1.Text = "";
        Urls.Add("http://adresa.cz/soubor1.zip");
        toolStripStatusLabel1.Text = "Stahuji Soubor 2";
        Urls.Add("http://adresa.cz/soubor2.zip");
        toolStripStatusLabel1.Text = "Stahuji IndustrialCraft2";
        Urls.Add("http://adresa.cz/soubor3.zip");
        toolStripStatusLabel1.Text = "Stahuji Soubor 3";
        //Dotaz jeslti by tahle podminka fungovala:
        if (checkBox4.Checked)
            {
                toolStripStatusLabel1.Text = "Stahuji Soubor 4";
                Urls.Add("http://adresa.cz/soubor4.zip");
            }


        DownloadFile(Urls[0]);
    }
}

        private void DownloadFile(string Url)
{
    string FileName = Url.Substring(Url.LastIndexOf('/') + 1);
    webClient.DownloadFileAsync(new Uri(Url), @"C:\Users\Patrik\Desktop\" + FileName);
}

private void Completed(object sender, AsyncCompletedEventArgs e)
{
    Urls.RemoveAt(0);
    if (Urls.Count > 0)
    {
        DownloadFile(Urls[0]);
    }
}

private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    long bytesReceived = e.BytesReceived;
    double num = double.Parse(bytesReceived.ToString());
    bytesReceived = e.TotalBytesToReceive;
    double num1 = double.Parse(bytesReceived.ToString());
    double num2 = num / num1 * 100;
    double num3 = Math.Truncate(num2);
    this.ProgressBar1.Value = int.Parse(num3.ToString());
    num3 = Math.Truncate(num2);
    label1.Text = string.Concat("Staženo: ", num3.ToString(), "%");
}
Editováno 7.2.2013 0:44
 
Odpovědět 7.2.2013 0:41
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):
  1. Ten text měníš na špatným místě - ty změníš text, pak přidáš název souboru do seznamu, pak změníš text, zase přidáš název souboru do seznamu a pak nakonec necháš stáhnout soubory z toho seznamu. Takže asi tu změnu textu budeš muset přemístit, ideálně asi do completed.
  2. Předpokládám, že Urls je List<String>. Použij místo toho třeba Dictionary<string, string> a klíč použij jako jméno stahovaného souboru a hodnotu jako složku, kam chceš stahovat.
  3. Samozřejmě, proč by nefungovala? :)
  4. Musel bys na začátku znát celkovou velikost. Asi nejjednodušší je udělat si nějaký speciální dotaz, kterým by ses zeptal a server tu velikost znal a poslal ji.
Nahoru Odpovědět 7.2.2013 1:28
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Dobře, já to zkusím. Pomohl by jsi mi s tím speciálním dotazem a tou 1? To moc nechápu.

 
Nahoru Odpovědět 7.2.2013 1:34
Avatar
RainbowShaggy:

Dobra tak jsem tam pridal ten Dictionary a upravil ale co s tímhle?

DownloadFile(Urls[0]);

a

private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            Urls.RemoveAt(0);
            if (Urls.Count > 0)
            {
                DownloadFile(Urls[0]);
            }
        }
 
Nahoru Odpovědět 7.2.2013 2:39
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

DownloadFile si uprav, abys mohl zadávat, kam se má stahovat

DownloadFile(Urls[0].Key, Urls[0].Value); // použití
private void DownloadFile(string Url, string Destination) // upravená metoda pro stahování
{
  //... vnitřek pak upravíš, aby se bral v potaz destination a stahuješ ten soubor tam
}
Nahoru Odpovědět 7.2.2013 10:25
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Takže jestli tomu správně rozumím tak tohle:

DownloadFile(Urls[0]);

nahradím tímhle:

DownloadFile(Urls[0].Key, Urls[0].Value);

a tohle:

private void Completed(object sender, AsyncCompletedEventArgs e)
         {
             Urls.RemoveAt(0);
             if (Urls.Count > 0)
             {
                 DownloadFile(Urls[0]);
             }
         }

upravím na:

private void Completed(object sender, AsyncCompletedEventArgs e)
        {
            Urls.RemoveAt(0);
            if (Urls.Count > 0)
            {
                DownloadFile(Urls[0].Key, Urls[0].Value);
            }
        }

Jinak

private void DownloadFile...

jsem již upravil.

Editováno 7.2.2013 12:46
 
Nahoru Odpovědět 7.2.2013 12:45
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

jj, akorát dictionary myslím nemá metodu RemoveAt, takže místo

Urls.RemoveAt(0);

budeš asi muset použít něco jako

Urls.Remove(Urls.Keys[0]);
Nahoru Odpovědět 7.2.2013 13:08
:)
Avatar
RainbowShaggy:

Tak je to upravené, ale:

DownloadFile(Urls[0].Key, Urls[0].Value);

píše chybu:
Error 1 The best overloaded method match for 'System.Collec­tions.Generic­.Dictionary<strin­g,string>.this[strin­g]' has some invalid arguments
Error 2 Argument 1: cannot convert from 'int' to 'string'
Error 3 The best overloaded method match for 'System.Collec­tions.Generic­.Dictionary<strin­g,string>.this[strin­g]' has some invalid arguments
Error 4 Argument 1: cannot convert from 'int' to 'string'

 
Nahoru Odpovědět 7.2.2013 13:27
Avatar
Luboš Běhounek (Satik):

Jak máš nadeklarované Urls ?

Nahoru Odpovědět 7.2.2013 13:29
:)
Avatar
RainbowShaggy:
Dictionary<string, string> Urls = new Dictionary<string, string>();
 
Nahoru Odpovědět 7.2.2013 13:35
Avatar
Luboš Běhounek (Satik):

Takhle to má být, napsal jsem to špatně:

DownloadFile(Urls.Keys.ElementAt(0), Urls[Urls.Keys.ElementAt(0)]);
Editováno 7.2.2013 13:43
Nahoru Odpovědět 7.2.2013 13:42
:)
Avatar
RainbowShaggy:

a tohle?

Urls.Remove(Urls.Keys[0]);
 
Nahoru Odpovědět 7.2.2013 13:56
Avatar
Luboš Běhounek (Satik):
Urls.Remove(Urls.Keys.ElementAt(0));
Nahoru Odpovědět 7.2.2013 14:13
:)
Avatar
RainbowShaggy:

Aha, díky moc a teď ještě:
1)Mám vepisovat něco tady?:

private void DownloadFile(string Url, string Destination)
      {

      }

2)Pomohl by jsi mi s tím ukazatelem toho stažení?

 
Nahoru Odpovědět 7.2.2013 14:17
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):
  1. Trochu se snaž, zamysli se, nebudu to psát celý za tebe :)

(ano, musíš tam samozřejmě nějak zapracovat to, že to nestahuješ napevno někam, ale že to stahuješ na místo, který ti přišlo jako parametr funkce)

  1. tomuhle bych se být tebou zatím asi vyhnul, jinak bych to řešil tak, že se klient nejdřív zeptá serveru postupně na velikosti těch souborů, sečte si je a pak to číslo používá pro ten ukazatel, ale musel bys i na serveru přidat nějakou funkčnost, která bude posílat velikost souboru, když se klient zeptá.
Nahoru Odpovědět 7.2.2013 14:49
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:
  1. Nic mě nenapadá
  2. To je až tak složité? :( No dobrá zkusím to pro tentokrát vynechat.
 
Nahoru Odpovědět 7.2.2013 15:14
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

Webclientovi jako jeden z parametrů při stahování souboru zadáváš, kam má soubor stahovat.
Co to nějak zkombinovat s tím, že máš dictionary, ve kterém máš záznamy jmen souborů (jako klíč) a k nim (jako hodnotu) místo, kam se mají stáhnout? :)

Nahoru Odpovědět 7.2.2013 15:28
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Dobrá tak možná bych věděl, ale nevím jak sestavit script.
Nenapsal bys mi ho? Tohle je poslední věc, co budu chtít. Díky

Editováno 7.2.2013 15:47
 
Nahoru Odpovědět 7.2.2013 15:46
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

Nejdřív to zkus sám, není to zase tak těžké, myslím, že to stačí okoukat z toho, co už tam máš.. :)

Nahoru Odpovědět 7.2.2013 16:03
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Tak jsem si s tím hrál dvě hodiny a samé chyby už fakt nevím :(

 
Nahoru Odpovědět 7.2.2013 21:16
Avatar
RainbowShaggy:

Dobře tak je to bez chyby mi tam něco chybělo ale nevím, jestli je to dobře:

private void DownloadFile(string Url, string Destination)
        {
            webClient.DownloadFileAsync(new Uri(Url), Destination);
        }
 
Nahoru Odpovědět 7.2.2013 21:39
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Tohle jo? Jako fakt? Dobrá, jdu to zkusit.

 
Nahoru Odpovědět 7.2.2013 21:55
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Tak fakt to funguje. Ještě jsem se chtěl zeptat na ty toolStripstatusy jak je teda upravit aby ukazovaly správně.

 
Nahoru Odpovědět 7.2.2013 22:11
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

Nejdřív zkoušej a až když něco nefunguje, tak se ptej :)

Nahoru Odpovědět 7.2.2013 22:25
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Vím že to musí být v Completed. V tom Completed asi musí být nějaká podmínka která zjišťuje který soubor se právě stahuje a podle toho to vypíše v tom statusu ne? Ale jak to udělat.

 
Nahoru Odpovědět 7.2.2013 22:33
Avatar
Luboš Běhounek (Satik):

Nejsem si jistý, ale možná by to mohlo být v EventArg u completed.

Nahoru Odpovědět 7.2.2013 22:43
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Dobře, ale teď jak udělat tu podmínku :)

 
Nahoru Odpovědět 7.2.2013 22:47
Avatar
Luboš Běhounek (Satik):

napiš v tý funkci completed

e.

a zmáčkni CTRL+MEZERNÍK, vyjede ti nabídka, co všechno má e k dispozici, tak se tam podívej, jestli tam někde není url stahovaného odkazu nebo název souboru :)

Nahoru Odpovědět 8.2.2013 13:16
:)
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

Myslím, že by jsi si nejdřív měl projít tutoriály (třeba tady na devbooku) a naučit se základy, než začneš psát aplikace, který maj něco stahovat z internetu :)

Nahoru Odpovědět 8.2.2013 13:22
:)
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Jo já vím, ale když nějakou aplikaci nutně potřebuješ tak si jí musíš vytvořit. Nevěděl jsem že stahování z Internetu bude tak komplikované, jako první způsob jsem totiž používal to neasynchronní stahování, ale to aplikaci zasekávalo, tak jsem se dozvěděl, že asynchronní stahování aplikaci zasekávat nebude. Myslel jsem, že se to nastavuje podobně jako normální neasynchronní stahování. Kdybych zjistil, že je to tak složité, tak bych se do toho ani nepouštěl.
Proto tě prosím o poslední dvě věci:

  1. Jak tedy udělat aby ty toolstripstatusy fungovaly.
  2. Kam umístit MessageBox o dokončení stahování souborů.
 
Nahoru Odpovědět 8.2.2013 13:34
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):
  1. ten toolstripstatus budes taky muset nacpat do completed.
  2. na konec completed do podmínky
if (Urls.Count == 0)
Nahoru Odpovědět 8.2.2013 13:55
:)
Avatar
RainbowShaggy:

Udělal jsem to takhle a:

private void Completed(object sender, AsyncCompletedEventArgs e)
       {
           Urls.Remove(Urls.Keys.ElementAt(0));
           if (Urls.Count > 0)
           {
               DownloadFile(Urls.Keys.ElementAt(0), Urls[Urls.Keys.ElementAt(0)]);
               toolStripStatusLabel1.Text = "Stahuji Soubor1";
               toolStripStatusLabel1.Text = "Stahuji Soubor2";
               toolStripStatusLabel1.Text = "Stahuji Soubor3";
               toolStripStatusLabel1.Text = "Stahuji Soubor4";
               toolStripStatusLabel1.Text = "Stahuji Soubor5";
               toolStripStatusLabel1.Text = "Stahuji Soubor6";
               toolStripStatusLabel1.Text = "Stahuji Soubor7";
               toolStripStatusLabel1.Text = "Stahuji Soubor8";
           }
           if (Urls.Count == 0);
           {
               const string message2 = "Instalace byla úspěšně dokončena!";
               const string caption2 = "Dokončeno!";
               var result2 = MessageBox.Show(message2, caption2,
                   MessageBoxButtons.OK,
                   MessageBoxIcon.Information);
           }
       }

Toolstripstatusy i tak nefungují :(
MessageBox sice ano, ale ukáže se po každém stažení souborů :(

 
Nahoru Odpovědět 9.2.2013 0:06
Avatar
RainbowShaggy:

Poradí tedy někdo? :(

 
Nahoru Odpovědět 10.2.2013 18:48
Avatar
lcet.m
Člen
Avatar
Odpovídá na RainbowShaggy
lcet.m:

Asi ne. Protože je evidentní, že netušíš co vlastně děláš, takže ti ani moc rady není. Leda bys poslal zadání aněkdo ti to třeba naprogramuje, ale nevím, proč by to dělal zadarmo.

 
Nahoru Odpovědět 10.2.2013 19:18
Avatar
Odpovídá na Luboš Běhounek (Satik)
RainbowShaggy:

Díky moc a ty toolStripStatusy? Díval jsem se výše ale u toho e. to ty soubory nenapsalo. Tak nevím co s tím.

 
Nahoru Odpovědět 10.2.2013 22:55
Avatar
Odpovídá na RainbowShaggy
Luboš Běhounek (Satik):

AsyncComplete­dEventArgs má vlastnost UserState, takže třeba v downloadfile si do ní uložíš třeba název souboru nebo číslo a pak v completed ji přečteš.

Nahoru Odpovědět 10.2.2013 23:05
:)
Avatar
 
Nahoru Odpovědět 11.2.2013 6:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 41 zpráv z 41.