• ベストアンサー

InternetReadFileを使ったファイルダウンロード

下のようなプログラムは、httpサーバから特定のファイルを ダウンロードすることが目的です。 (※referer, file名は仮のものです。) 試しに動かしてみて、転送速度が比較的速い場合には、一応問題なく ダウンロードすることができたのですが、転送速度が遅い場合には、 ファイルサイズがどんどん膨れ上がってしまいます。 問題は、InternetReadFileでブロックされることがないからだと 推測しましたが、情報が少なく困っています。 転送速度が遅い場合にも正常にダウンロードするにはどうしたら よいでしょうか? #include <windows.h> #include <wininet.h> #include <stdio.h> #include <stdlib.h> bool GetHttpFile(){   HINTERNET hInternet;   HINTERNET hFile;   char Buf[1000]; /* バッファ */   DWORD ReadSize;   BOOL bResult;   wchar_t szHead[] = TEXT("Referer:http://aaa.com/\r\n\r\n"); // ヘッダにRefererを追加する   FILE *fp;   bool ret;   /* 保存先ファイル作成/open */     fp = fopen("sample.zip", "wb");   if (fp == NULL){  /* ファイル作成/openに失敗 */     ret = false;        }else{ /* ファイル作成/openに成功 */     /* WININET初期化 */     hInternet = InternetOpen(       TEXT("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"),       INTERNET_OPEN_TYPE_PRECONFIG,       NULL,       NULL,       0);        /* URLのオープン */     hFile = InternetOpenUrl(       hInternet,       TEXT("http://aaa.com/bbb.zip"),       szHead,       0,       INTERNET_FLAG_RELOAD,       0);        /* オープンしたURLからデータを(1000バイトずつ)読み込む */     for(;;){       ReadSize = 1000;          bResult = InternetReadFile(         hFile,         Buf,         1000,         &ReadSize);          /* 全て読み込んだらループを抜ける */       if(bResult && (ReadSize == 0)) break;              /* ファイルに書き込み */       fwrite(Buf, sizeof(char), 1000, fp);     }        /* 後処理 */     InternetCloseHandle(hFile);     InternetCloseHandle(hInternet);     fclose(fp);     ret = true;   }      return ret; } int main(){   if(GetHttpFile() == true){     printf("成功\n");   }else{     printf("失敗\n");   }      return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

あくまで予想なので間違ってるかも ダウンロードの関数とか使ったことないし、処理もちらっとしか見てないけど、 1000バイトずつ)読み込むってので、1000バイト読めなかった場合の差分が増えているってことはない? 例えば500しか読めなかったら、残りの500が不定データとして格納されてその分最終的なDLサイズが増えているとか?

upanepa
質問者

お礼

ご回答ありがとうございます。 まさにその通りだと思われます。 fwriteの引数設定がよくないようでした。

その他の回答 (1)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.1

私の環境で 30MB のファイルでテストしましたがサイズが膨らむ現象は再現しないので わからないのですが、気になるところがありましたので……。 >for(;;){ >ReadSize = 1000; ReadSize = 0; >/* ファイルに書き込み */ >fwrite(Buf, sizeof(char), 1000, fp); fwrite(Buf, sizeof(char), ReadSize, fp); としないと、TCP/IP のタイムアウトが原因でサイズが膨らむことはないのでしょうか?

upanepa
質問者

お礼

ご回答ありがとうございます。 おそらくご指摘の通りだと思われます。 InternetReadFileの最後の引数には、ダウンロードした byte数が入るようで、ご指摘の通りに修正してみました。 現在は帯域が大きく直ったか確かめられません。 正常にダウンロードできたことは確認しました。

関連するQ&A