1

ファイルを自分のコンピューターにダウンロードし、同時にバイト配列に保存しようとしています:

try
{
    var req = (HttpWebRequest)HttpWebRequest.Create(url);
    var fileStream = new FileStream(filePath,
        FileMode.Create, FileAccess.Write, FileShare.Write);

    using (var resp = req.GetResponse())
    {
        using (var stream = resp.GetResponseStream())
        {
            byte[] buffer = new byte[0x10000];
            int len;
            while ((len = stream.Read(buffer, 0, buffer.Length)) > 0)
            {
                //Do with the content whatever you want
                // ***YOUR CODE*** 

                MemoryStream memoryStream = new MemoryStream();
                if (len > 0)
                {
                    memoryStream.Write(buffer, 0, len);
                    len = stream.Read(buffer, 0, buffer.Length);
                }

                file = memoryStream.ToArray();
                fileStream.Write(buffer, 0, len);
            }
        }
    }

    fileStream.Close();
}
catch (Exception exc) { }

そして、これですべてのファイルをダウンロードするわけではないことに気付きました。

ファイルをダウンロードして同時に作業したいので、やりたいです。なぜこの問題が発生するのですか?

4

2 に答える 2

2

を使用して、ファイルのバイトを取得するはるかに簡単な方法がありますSystem.Net.WebClient.WebClient()

private static byte[] DownloadFile(string absoluteUrl)
{
   using (var client = new System.Net.WebClient())
   {
      return client.DownloadData(absoluteUrl);
   }
}

使用法:

var bytes = DownloadFile(absoluteUrl);
于 2014-02-27T11:47:04.630 に答える
1

問題は二重読み取りのようです-メモリストリーム/ファイルストリームに異なるものを入れています-それはもっと似ているはずです:

// declare file/memory stream here
while ((len = stream.Read(buffer, 0, buffer.Length)) > 0)
{
      memoryStream.Write(buffer, 0, len);
      fileStream.Write(buffer, 0, len);
      // if you need to process "len" bytes, do it here
}

「len」バイトをすぐに処理すると、「memoryStream」が完全に失われる可能性があります。メモリ内に収まる場合は、WebClient.DownloadData を使用してから File.WriteAllBytes を使用する方が簡単な場合があります。

于 2013-04-14T10:46:16.807 に答える