Diskuze: Stahování
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Vlastník
Zobrazeno 19 zpráv z 69.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Pokud použiju tohle:
private void button1_Click(object sender, EventArgs e)
{
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
List<string> Urls = new List<string>();
Urls.Add("http://www.itnetwork.cz/download2.php?file=505b0c67d08e0&name=ISIM_setup.exe");
Urls.Add("http://www.itnetwork.cz/download2.php?file=5065548f7c5a8&name=MenovaKalkulacka.zip");
foreach (string File in Urls)
{
string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
string fileName = new ContentDisposition(headerContentDisposition).FileName;
webClient.DownloadFileAsync(new Uri(File), @"C:\Users\Patrik\Desktop" + fileName);
}
}
private void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void Completed(object sender, AsyncCompletedEventArgs e)
{
MessageBox.Show("Stahování bylo úspěšně dokončeno");
}
Tak to napíše:
Odkaz na objekt není nastaven na instanci objektu.
Je to u řádku s:
string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
No jo, to je fakt. To bys musel použít OpenRead
, ale pak bys
musel zapisovat data manuálně.
Budeš stahovat soubory z určitého serveru? Že by sis ten název vytvořil podle url adresy?
Nebo ho můžeš zadávat manuálně.
Budu to stahovat z určitého serveru.
A můžeš ukázat příklady adres odkazující na soubory? Jestli se z nich dá nějak vyčíst název.
Př. adresy: http://neco.eu/…kysoubor.zip
Tak tady by šlo třeba:
string adresa = "http://neco.eu/download/nejakysoubor.zip";
string fileName = adresa.Substring(adresa.LastIndexOf('/') + 1);
Dobře a když je těch souborů více?
List<string> Urls = new List<string>();
Urls.Add("http://neco.eu/download/nejakysoubor.zip");
Urls.Add("http://neco.eu/download/nejakysoubor2.zip");
foreach (string File in Urls)
{
string FileName = File.Substring(File.LastIndexOf('/') + 1);
webClient.DownloadFileAsync(new Uri(File), @"C:\Users\Patrik\Desktop\" + FileName);
}
Díky moc, ale teď to píše zase tuto chybu:
'string' does not contain a definition for 'SubString' and no extension method 'SubString' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)
Je to Substring. Ale tak to už sis mohl dohledat
Aha jen změnit na malé písmeno , no to mohl Díky moc, doufám že už to bude fungovat. Hraju si s tím už skoro týden.
Ach jo, už zase:
Klient WebClient nepodporuje souběžné operace vstupu a výstupu.
U řádku:
webClient.DownloadFileAsync(new Uri(File), @"C:\Users\Patrik\Desktop\" + FileName);
Sice nevím, proč je File s velkým F, ale Substring nemá to druhé velké S.
EDIT: Ještě k tomu řádku, chyba může být (a tady je) na řádku výše, než ukazuje IDE.
Aha. Tak to asi budeš muset počkat na dokončení stahování a v události
Completed volat další. Nebo možná zkus použít metodu
DownloadFile
bez toho Async.
Jinak asi:
private void Completed(object sender, AsyncCompletedEventArgs e)
{
Urls.RemoveAt(0);
if (Urls.Count > 0)
{
string FileName = Urls[0].Substring(Urls[0].LastIndexOf('/') + 1);
webClient.DownloadFileAsync(new Uri(Urls[0]), @"C:\Users\Patrik\Desktop\" + FileName);
}
}
A Urls a webClient si musíš dát jako třídní proměnné. Tzn. mimo metodu, aby byly viditelné i pro ostatní metody. Snad to už bude fungovat. Vařím z vody nikdy jsem přes C# nic nestahoval. Tak mě prosím omluv, že chybuju.
Nevadí, každý chybuje, bez toho Async jsme to měli doposud, ale ten
program při stahování neodpovídal a různě se zasekával i když soubory
stáhl, to je pravda. Proto jsem se doslechl že když přidám Async, tak by to
mělo být v pořádku a ten program by měl jet plynule. Mohl bych se tedy
zeptat, jak by vypadal výsledný script? Asi jsem ..., že si to neumím
udělat, ale takové věci jsem ještě nedělal.
Díky moc
Nějak takto. Ale projdi si základy tady na webu. Nechci to tu za tebe stále psát
WebClient webClient = new WebClient();
List<string> Urls = new List<string>();
private void button1_Click(object sender, EventArgs e)
{
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);
Urls.Add("http://neco.eu/download/nejakysoubor.zip");
Urls.Add("http://neco.eu/download/nejakysoubor2.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]);
}
}
Zobrazeno 19 zpráv z 69.