Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Загрузка больших файлов на C++

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C/C++ только в данном разделе

Ответ
 
Опции темы
Старый 04.04.2013, 22:47   #1
 Пехотинец
Аватар для Annedroid
 
Annedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нации
Регистрация: 11.01.2012
Сообщений: 84
Популярность: 3472
Сказал(а) спасибо: 97
Поблагодарили 182 раз(а) в 97 сообщениях
 
По умолчанию Загрузка больших файлов на C++

Всем привет,
Моя программа загружает нужный компонент с сайта, раньше он весил 17 кб / 17 408 байт и можно было просто поставить максимальный размер буффера в функции (65 536) и эта проблема как бы отходила, но после упаковки файл стал весить 1,35 МБ, стало быть это 1 421 312 байт, мне нужен правильный код, чтобы выделить память, скачать, сохранить в файл и освободить память.
Вот мой предыдущий код:

Код:
int Get( char* szUrl, char* szFile )
	{
		BYTE cBuffer[ INTERNET_GET_MAX ];

		HINTERNET hInternet = InternetOpenA( INTERNET_LOGIN, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0 );

		HINTERNET hFile = InternetOpenUrlA( hInternet, szUrl, 0, 0, INTERNET_FLAG_RELOAD, 0 );

		DWORD dwReadSize = INTERNET_GET_MAX - 1;

		int uResult = InternetReadFile( hFile, cBuffer, dwReadSize, &dwReadSize );

		cBuffer[ dwReadSize ] = '\0';

		InternetCloseHandle( hInternet );
		InternetCloseHandle( hFile );

		if ( uResult )
		{
			DeleteFileA( szFile );

			HANDLE hOutputFile = CreateFileA( szFile, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 );

			uResult = WriteFile( hOutputFile, cBuffer, dwReadSize, &dwReadSize, 0 );

			CloseHandle( hOutputFile );

			return ( uResult ) ? ( uResult ) : ( 0 - GetLastError( ) );
		}

		return ( 0 - GetLastError( ) );
	}
INTERNET_GET_MAX - 65 536, как уже писала ранее.
Возможно удастся как-то по частям загрузить.
П.с. курила malloc, все равно не очень понятно.
Заранее спасибо вам.

Последний раз редактировалось Annedroid; 04.04.2013 в 22:53.
  Ответить с цитированием
Старый 05.04.2013, 01:17   #2
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Загрузка больших файлов на C++

Код:
int Get( char* szUrl, char* szFile )
{
		BYTE *cBuffer = NULL;
		DWORD dwReadSize = 0;

		HINTERNET hInternet = InternetOpenA( INTERNET_LOGIN, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0 );

		HINTERNET hFile = InternetOpenUrlA( hInternet, szUrl, 0, 0, INTERNET_FLAG_RELOAD, 0 );

		if (!InternetQueryDataAvailable(hFile, &dwReadSize, 0, 0))
			return -1;
		
		cBuffer = new BYTE[dwReadSize];
		if (!cBuffer)
			return -2;
		
		int uResult = InternetReadFile( hFile, cBuffer, dwReadSize, &dwReadSize );

		cBuffer[ dwReadSize ] = '\0';

		InternetCloseHandle( hInternet );
		InternetCloseHandle( hFile );

		if ( uResult )
		{
			DeleteFileA( szFile );

			HANDLE hOutputFile = CreateFileA( szFile, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 );

			uResult = WriteFile( hOutputFile, cBuffer, dwReadSize, &dwReadSize, 0 );

			CloseHandle( hOutputFile );

			return ( uResult ) ? ( uResult ) : ( 0 - GetLastError( ) );
		}
		
		delete [] cBuffer;
		
		return ( 0 - GetLastError( ) );
}
Как то так.
- Запрос размера файла через InternetQueryDataAvailable
- Динамически выделяем память в соответствии с размером доступного файла

И, если выходишь из функции прямо из "if", то не забудь сначала освободить память (delete [] cBuffer).

За основу взята инфа из RSDN - [Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось twice; 05.04.2013 в 01:23.
  Ответить с цитированием
Пользователь сказал cпасибо:
Annedroid (05.04.2013)
Старый 05.04.2013, 15:49   #3
 Пехотинец
Аватар для Annedroid
 
Annedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нации
Регистрация: 11.01.2012
Сообщений: 84
Популярность: 3472
Сказал(а) спасибо: 97
Поблагодарили 182 раз(а) в 97 сообщениях
 
По умолчанию Re: Загрузка больших файлов на C++

Цитата:
Сообщение от twiceПосмотреть сообщение
Как то так.
- Запрос размера файла через InternetQueryDataAvailable
- Динамически выделяем память в соответствии с размером доступного файла

И, если выходишь из функции прямо из "if", то не забудь сначала освободить память (delete [] cBuffer).

За основу взята инфа из RSDN - [Ссылки могут видеть только зарегистрированные пользователи. ]

Спасибо вам, ваш код работает!
П.с. если кому-то нужен мой класс AInternet:
[Ссылки могут видеть только зарегистрированные пользователи. ]

Последний раз редактировалось Annedroid; 05.04.2013 в 16:22.
  Ответить с цитированием
Пользователь сказал cпасибо:
twice (05.04.2013)
Старый 05.04.2013, 16:40   #4
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Загрузка больших файлов на C++

Цитата:
Сообщение от twiceПосмотреть сообщение
И, если выходите из функции прямо из "if", то не забудьте сначала освободить память (delete [] cBuffer).

Код:
		if ( uResult )
		{
			DeleteFileA( szFile );

			HANDLE hOutputFile = CreateFileA( szFile, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0 );

			uResult = WriteFile( hOutputFile, cBuffer, dwReadSize, &dwReadSize, 0 );

			CloseHandle( hOutputFile );

			return ( uResult ) ? ( uResult ) : ( 0 - GetLastError( ) );
		}
Перед return забыто "delete [] cBuffer", что приведет к утечки памяти при правильном исходе работы функции (функция Get).

Также рекомендую обернуть все содержимое заголовочника в
Код:
#ifndef AINTERNET_H
#define AINTERNET_H
тут тело заголовочника
#endif
Это поможет избежать ошибок компиляции/линковки, если данный заголовочник будет подключен в нескольких модулях.

Последний раз редактировалось twice; 05.04.2013 в 16:48.
  Ответить с цитированием
Пользователь сказал cпасибо:
Annedroid (05.04.2013)
Старый 05.04.2013, 17:58   #5
 Пехотинец
Аватар для Annedroid
 
Annedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нацииAnnedroid гордость нации
Регистрация: 11.01.2012
Сообщений: 84
Популярность: 3472
Сказал(а) спасибо: 97
Поблагодарили 182 раз(а) в 97 сообщениях
 
По умолчанию Re: Загрузка больших файлов на C++

Спасибо... Учила, а не все помню...
  Ответить с цитированием
Старый 11.05.2013, 15:03   #6
 Пехотинец
Аватар для twice
 
twice на правильном путиtwice на правильном пути
Регистрация: 07.07.2012
Сообщений: 60
Популярность: 171
Сказал(а) спасибо: 3
Поблагодарили 11 раз(а) в 10 сообщениях
 
По умолчанию Re: Загрузка больших файлов на C++

Annedroid, взяв твой класс за основу, немного доработал его.

[Ссылки могут видеть только зарегистрированные пользователи. ]

Может кому-нибудь пригодится.
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Статья] Быстрая загрузка файлов с сервера •L• Статьи и описания по Counter-Strike 0 04.04.2012 22:17
загрузка файлов komesar Общение и обсуждение Counter-Strike 5 16.03.2011 23:55
Быстрая загрузка файлов с http сервера PavelQwa Counter-Strike 0 24.03.2010 08:05

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:23.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net