Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > [CB2009] Как скачать файл с интернета.


Автор: MuForum 24.11.2009, 13:38
Доброго времени суток.
Работаю на "C++ Builder 2009".

# Задача: Имя путь к файлу на хостинге и путь куда сохранить файл, необходимо скачать данный файл на локальный компьютер.
1.1. Форма не должна быть в этот момент неактивна. (То есть, пользователь должен в это время работать с формой)
1.2. Должна быть полоска загрузки файла. (Статистика)
- Использую компонент "TCGauge";


В "C++ Builder 6" был такой замечательный компонент как NMHHTP1, который прекрасно справлялся с этой задачей.
- Однако в "C++ Builder 2009" данный компонент убрали.


Попробовал использовать Indy 9 с TIdAntiFreeze, но хреновато этот анти-фрих работает...

# Возможные решения данной проблемы:
1. Indy & Thread. (Запускать каждый файл для скачивания в отдельном потоке)
2. Ваш вариант.


P.S. -> Жду комментариев.

Автор: Alca 24.11.2009, 13:55
WinInet + TThread 

Автор: Platov 25.11.2009, 17:52
 
Цитата
WinInet + TThread  
 полностью согласен.

что-то вроде такого:
Код

//---------------------------------------------------------------------------

bool Download(AnsiString url,AnsiString dest)
{
char buf[256];
AnsiString str=dest,agent=Edit1->Text;

int np;
bool err;
err=false;

HINTERNET session,file;          //PRE_CONFIG_INTERNET_ACCESS INTERNET_OPEN_TYPE_PRECONFIG
session = InternetOpen(agent.c_str(), PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);

file    = InternetOpenUrl(session,url.c_str(), 0, 0, 0, 0);

DWORD    Code = 0,
Size = sizeof( Code );
if (file==NULL) err=true;
 else
if (HttpQueryInfo( file, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, ( LPVOID ) &Code, ( LPDWORD  ) &Size, NULL  ) )
 if (Code!=200) err=true;
else
{


unsigned long len=0,offs=0;
AnsiString buff="";

if (file!=NULL)
{
DWORD Written;
HANDLE hDestFile = CreateFile(str.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

if (hDestFile == INVALID_HANDLE_VALUE) err=true;
else

do {
   InternetReadFile(file, buf, sizeof(buf), &len);
   if (len>=0)
   {
      offs += len;
      buff=buf;
      WriteFile(hDestFile, buf, len, &Written, NULL);
      Application->ProcessMessages();
   }

   else
   {
      int error = GetLastError();
      err=true;
      InternetCloseHandle(file);
      InternetCloseHandle(session);
      Application->ProcessMessages();
      ::Sleep(1000);
      Application->ProcessMessages();
      session = InternetOpen("Our Agent", PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);
      file = InternetOpenUrl(session, url.c_str(), 0, 0, 0, 0);
      InternetSetFilePointer(file, offs, 0, FILE_BEGIN, 0);
   }

} while (len);

CloseHandle(hDestFile);

}

InternetCloseHandle(file);
InternetCloseHandle(session);


if (!err) return true;
 else return=false;
}
//---------------------------------------------------------------------------

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)