Herunterladen von mehreren Dateien-WebClient
Ich versuche mehrere Dateien herunterladen, aber es funktioniert nicht so, wie ich erhofft hatte.
Kann mir jemand sagen, was falsch mit diesem script, da habe ich versucht, eine Menge Dinge, und weiß wirklich nicht mehr was tun.
public static void DownloadFile(string url)
{
WebClient client = new WebClient();
var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
foreach (var item in urls)
{
client.DownloadFile(item, "C:\\" + name);
}
}
private void btnGo_Click(object sender, EventArgs e)
{
urls.Add("url1");
urls.Add("url2");
urls.Add("url3");
Parallel.ForEach(urls,
new ParallelOptions { MaxDegreeOfParallelism = 10 },
DownloadFile);
}
using (var sr = new StreamReader(HttpWebRequest.Create(url).GetResponse().GetResponseStream()))
{
using (var sw = new StreamWriter(url.Substring(url.LastIndexOf('/'))))
{
sw.Write(sr.ReadToEnd());
}
}
- Die Antwort ist hier stackoverflow.com/questions/6992553/...
- Ich habe versucht, aber konnte nicht bekommen es überhaupt zu arbeiten :(.
- wo kommt dein code break genau ? Hast du Debuggen ?
- Gut, es lädt alle Dateien zur gleichen Zeit und überschreibt jedes andere, so erhalten Sie 3 beschädigte Dateien.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mit einem
System.Net.HttpWebRequest
statt.Dies ist, was der code würde wie folgt Aussehen:
Weil die URL, die Sie erzählte mir, dass der Kommentar nicht mit einer richtigen Implementierung des HTTP-Protokolls. Müssen Sie fügen Sie diese an Ihre config-Datei, um für Sie zu arbeiten (entweder App.config oder Web.config, je nachdem, ob es ein ASP.Net Website oder offline-Anwendung):
Als zu deinem problem mit Namen kollidieren, die Sie sagten in Ihrem Kommentar, dies sollte behoben werden, indem Sie Ihre
var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
in etwas anderes.Wenn Sie wollen, um eine inkrementelle mit dem Namen, den Sie verwenden konnten, dies:
WebClient
ist nichts aber ein schickes wrapper um den IE.HttpWebRequest
auf der anderen Seite ist die grundlegende Voraussetzung für diese.You agree while using MediaFire Services, that you may not: Use any robot, spider, offline readers, site search and/or retrieval application, or other device to retrieve or index any portion of the Services, with the exception of public search engines;
. Da, wie dies gegen Ihre Nutzungsbedingungen, kann ich dir nicht helfen, noch ermutigen Sie, um fortzufahren.Die Sie herunterladen, alle Dateien auf die gleiche Datei in Ihrer DownloadFile-code, übernimmt die einzigen Aufruf dieser Funktion lädt alle Dateien.
Fixes:
Option 1: benutzen Sie nicht
Parallel.ForEach
und rufen Sie einfach DownloadFile einmal. Geben Sie eindeutige Dateinamen für jeden download. I. e. durch die Einnahme Teil der Url, die Sie herunterladen oder verwenden Sie einfach random/temporäre Dateinamen.Etwas wie dies (unter der Annahme von urls ist eine Art von
IEnumerable<string>
)Option 2:
Parallel.ForEach
aber ändern DownloadFile-code für den download nur eine einzige Datei:var name = url.Substring(url.LastIndexOf('/')).Remove(0, 1);
WebClient
für den einfachen Zweck des Herunterladens einer Datei :P.IEnumerable<string>
? IstList<string> urls = new List<string>();
in Ordnung, zu verwenden?List<T>
erbt diese Schnittstelle. Also ja,List<T>
istIEnumerable<T>
(T-string in diesem Fall).List<string>
istIEnumerable<string>
die Sie leicht sehen können, wenn Sie klicken Sie auf F12 gehen auf die definition von List<T> Objekt (oder RTFM)WebClient
ist nur ein schicker wrapper um mein code :P. (P. S. +1)