3

25 MB を超えるファイルをダウンロードする必要がありますが、私のネットワークでは 25 MB のファイルしか要求できません。

次のコードを使用しています

  const long DefaultSize = 26214400;
    long Chunk = 26214400;
    long offset = 0;
    byte[] bytesInStream;
    public void Download(string url, string filename)
    {
        long size = Size(url);
        int blocksize = Convert.ToInt32(size / DefaultSize);
        int remainder = Convert.ToInt32(size % DefaultSize);
        if (remainder > 0) { blocksize++; }

        FileStream fileStream = File.Create(@"D:\Download TEST\" + filename);
        for (int i = 0; i < blocksize; i++)
        {
            if (i == blocksize - 1)
            {
                Chunk = remainder;

            }

            HttpWebRequest req = (HttpWebRequest)System.Net.WebRequest.Create(url);
            req.Method = "GET";
            req.AddRange(Convert.ToInt32(offset), Convert.ToInt32(Chunk+offset));
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
            // StreamReader sr = new StreamReader(resp.GetResponseStream());


            using (Stream responseStream = resp.GetResponseStream())
            {
                bytesInStream = new byte[Chunk];
                responseStream.Read(bytesInStream, 0, (int)bytesInStream.Length);
                // Use FileStream object to write to the specified file
                fileStream.Seek((int)offset, SeekOrigin.Begin);
                fileStream.Write(bytesInStream,0, bytesInStream.Length);
            }
            offset += Chunk;

        }
        fileStream.Close();

    }
    public long Size(string url)
    {
        System.Net.WebRequest req = System.Net.HttpWebRequest.Create(url);
        req.Method = "HEAD";
        System.Net.WebResponse resp = req.GetResponse();
        resp.Close();
        return resp.ContentLength;

    }

ディスクにコンテンツを適切に書き込んでいますが、コンテンツが機能していません

4

4 に答える 4

4

次のように、書き込み前にどれだけ読み取られたかを確認する必要があります(シークするオフセットを覚えておく必要はありません。シークは書き込み時に自動的に行われます)。

int read;
do
{
    read = responseStream.Read(bytesInStream, 0, (int)bytesInStream.Length);
    if (read > 0)
        fileStream.Write(bytesInStream, 0, read);
}
while(read > 0);
于 2012-11-26T14:03:24.367 に答える
1

セグメント化されたC#ファイルダウンローダーに役立つ可能性のある同様のSOの質問があり ます

複数の接続を開いて単一のファイルをダウンロードするにはどうすればよいですか?

また、このコードプロジェクトの記事 http://www.codeproject.com/Tips/307548/Resume-Suppoert-Downloading

于 2012-11-26T15:38:40.303 に答える