Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2013, 00:27   #1
questy
Новичок
Джуниор
 
Регистрация: 23.08.2013
Сообщений: 2
По умолчанию InternetReadFile не читает архивы

Нужно скачать файл из интернета, скачивает нормально, но архивы почему то не получается. Читает первые 800 Байт (ну или меньше), потом вообще не читает(BytesRead ==0) и в итоге выходит из цикла, так ничего и не докачав.

Вот кусок, который не работает:
Код:
FSession = InternetOpen(TEXT("Our Agent"),PRE_CONFIG_INTERNET_ACCESS, 0, 0, 0);

FURL = InternetOpenUrl(FSession, pUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0);
InternetSetFilePointer(FURL, 0, NULL, FILE_BEGIN, 0);

DWORD BytesRead;	  //прочитанные байты 
DWORD BytesWrite;	  //записанные байты
TCHAR buffer[4096]; //буфер в 4 КБайта

do
	{  
          if (InternetReadFile(FURL, buffer, sizeof(buffer)-1, &BytesRead))
		{	
		WriteFile(hTempFile, buffer, sizeof(buffer)-1, &BytesWrite, NULL); 
									dwRead += BytesRead;
									this->ThreadTask();
		 } 
						
	}
			while (BytesRead != 0);

Последний раз редактировалось Stilet; 24.08.2013 в 10:53.
questy вне форума Ответить с цитированием
Старый 24.08.2013, 10:51   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А почему вы пишете весь буфер, а не только то, что прочитали из сети?
Кроме того, посмотрите *что* скачалось когда качаете архив - откройте файл текстовым редактором.
waleri вне форума Ответить с цитированием
Старый 24.08.2013, 10:54   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Может антивирь не пропускает? У меня бывает такое что антивирус пробует разархивировать, не может и лочит. Хорошо хоть не так часто.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2013, 11:03   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Попробуйте через такую функцию. Читает любые бинарные файлы:

Код:
/* Прочитать бинарный файл с хоста
   const AnsiString host,
   const AnsiString patch, - путь с файлом
   const AnsiString file   - файл, в который будет записана инфа
*/
bool __fastcall TMainForm::InetReadFile(const AnsiString host,
                      const AnsiString patch, const AnsiString file)
{
bool ok = false;
// инициализируем WinInet
HINTERNET hInternet = ::InternetOpen(NULL,
            INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);

if(hInternet != NULL) // открываем HTTP сессию
  {
  HINTERNET hConnect = ::InternetConnect(hInternet, host.c_str(),
                INTERNET_DEFAULT_HTTP_PORT,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);

  if (hConnect != NULL)
    {// открываем запрос
    HINTERNET hRequest = ::HttpOpenRequest(hConnect,
                    "GET",
                    patch.c_str(),
                    NULL,NULL,0,INTERNET_FLAG_KEEP_CONNECTION,1);

    if (hRequest != NULL)
      {// посылаем запрос
      BOOL bSend = ::HttpSendRequest(hRequest, NULL,0, NULL,0);
                if (bSend)// создаём выходной файл
                  {
                    int hndl = FileCreate(file.c_str());
                    if(hndl >= 0)
                      {
                      ok = true;
                      for(;;)
                       {
                       char szData[256];
                       DWORD dwBytesRead;
                       bool bRead = ::InternetReadFile(hRequest,szData,sizeof(szData) - 1,&dwBytesRead);
                       if(bRead == false || dwBytesRead == 0)break;
                       // сохраняем результат
                       szData[dwBytesRead] = 0;
                       FileWrite(hndl,szData,dwBytesRead);
                       }
                    }
                   FileClose(hndl);
                  }
                }
                // закрываем запрос
                ::InternetCloseHandle(hRequest);
            }
            // закрываем сессию
            ::InternetCloseHandle(hConnect);
        }
        // закрываем WinInet
        ::InternetCloseHandle(hInternet); //*/
return ok;
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 24.08.2013 в 11:06.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
InternetReadFile - проблемы с кодировками Gtx541 Win Api 2 07.06.2010 13:36
Архивы Koi Операционные системы общие вопросы 2 02.02.2009 18:54
MPQ архивы D!zel Общие вопросы Delphi 9 26.01.2009 13:14
mpq архивы Хамяг Мультимедиа в Delphi 0 31.12.2008 23:25
Архивы и Delphi Avel Компоненты Delphi 7 27.11.2008 22:06