CInternetFile::GetLength()は今読み込めるサイズが返ってくる!

MSDNには「ファイルのサイズを返します。」としか書いてないが、実は今読める分のサイズが返ってくるだけで、必ずしもファイルサイズを表してるわけではない。

なので返ってくる値が0になるまで繰り返し読み込む必要がある

CInternetFile *p_if_obj;
p_if_obj = m_ftpConP->OpenFile(pstrRemoteFile);
if( NULL == p_if_obj ){
  return FALSE;
}

long total_size = 0;
while(1){
  long size = (long)p_if_obj->GetLength();
  if( 0 == size ){
    break;
  }
  if( max_size < (total_size+size) ){
    return FALSE;
  }
  if( NULL == p_if_obj->Read((char*)p_out+total_size,size) ){
    m_ftpConP->Close();
    return FALSE;
  }
  total_size += size;
}

m_ftpConP->Close();


ネタ元