2017-06-11 12 views
0

最新のバイトから開始し、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; 
    } 
} 

答えて

0

DownloadFileAsyncは仮想ではありません。

WebClient.DownloadFileAsyncメソッドは、ネットワーク上の場所からファイルをダウンロードするのに便利な方法です。単にURLとローカルパスを受け入れ、そのジョブを実行します。一時停止と再開の要件はこのAPIの対象外です。レスポンスストリームから読み込み、ファイルストリーム(Appendモードの既存のファイルから開く)に書き込むコードを記述する必要があります。

+0

webclient.DownloadFileAsyncにこのようなメソッドを使用することは可能ですか? (私はすべてのコードをhttpwebrequestに変更しないようにしたい) – Supreme

+0

カスタムクラスに 'DownloadFileWithRange'のような新しいメソッドを追加することができます。[ここから](https://www.codeproject.com/Tips/307548/ Resume-Suppoert-ダウンロード)。明示的に範囲を(from、to)に設定する必要はなく、コードはネットワークリソースのコンテンツ長とローカルファイルのファイル長を検出し、範囲を計算できます。 – kennyzx

+0

私の送られたトークンでは動作しません。 – Supreme

関連する問題