最新のバイトから開始し、0からではなく最新のバイトからダウンロードを一時停止した後、ファイルをダウンロードし続けることです。addRangeヘッダーを私のカスタムクラス(期待どおり)に追加しましたが、DownloadFileAsyncデフォルトでは、ダウンロードしたファイルを上書きして、最初から作成します。WebClient c#からDownloadFileAsyncを上書きして、ダウンロードしたファイルを上書きしないで置き換えることはできますか?
は、ここに私のカスタムクラスです:あなたはそれをオーバーライドすることはできませんので
public class CookieAwareWebClient : WebClient
{
private class CookieContainer
{
Dictionary<string, string> _cookies;
public string this[Uri url]
{
get
{
if (_cookies.TryGetValue(url.Host, out string cookie))
return cookie;
return null;
}
set
{
_cookies[url.Host] = value;
}
}
public CookieContainer()
{
_cookies = new Dictionary<string, string>();
}
}
private CookieContainer cookies;
private readonly long from;
private readonly long to;
public CookieAwareWebClient(long from, long to) : base()
{
cookies = new CookieContainer();
this.from = from;
this.to = to;
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
string cookie = cookies[address];
if (cookie != null)
((HttpWebRequest)request).Headers.Set("cookie", cookie);
if (from != 0 || to != 0)
{
((HttpWebRequest)request).AddRange(from, to);
}
}
return request;
}
protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
{
WebResponse response = base.GetWebResponse(request, result);
string[] cookies = response.Headers.GetValues("Set-Cookie");
if (cookies != null && cookies.Length > 0)
{
string cookie = "";
foreach (string c in cookies)
cookie += c;
this.cookies[response.ResponseUri] = cookie;
}
return response;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
string[] cookies = response.Headers.GetValues("Set-Cookie");
if (cookies != null && cookies.Length > 0)
{
string cookie = "";
foreach (string c in cookies)
cookie += c;
this.cookies[response.ResponseUri] = cookie;
}
return response;
}
}
webclient.DownloadFileAsyncにこのようなメソッドを使用することは可能ですか? (私はすべてのコードをhttpwebrequestに変更しないようにしたい) – Supreme
カスタムクラスに 'DownloadFileWithRange'のような新しいメソッドを追加することができます。[ここから](https://www.codeproject.com/Tips/307548/ Resume-Suppoert-ダウンロード)。明示的に範囲を(from、to)に設定する必要はなく、コードはネットワークリソースのコンテンツ長とローカルファイルのファイル長を検出し、範囲を計算できます。 – kennyzx
私の送られたトークンでは動作しません。 – Supreme