Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать размер файла на сервере, Запросить размер файла на сервере 
V
    Опции темы
Bima
Дата 12.12.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



есть код:
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
int retcode;
retcode = URLDownloadToFile( NULL, myUrl.c_str(), MyFile.c_str(), 0, 0 );
Label1->Caption=IntToStr(retcode);
}

myUrl и MyFile это переменные AnsiString. Куда записываются адрес файла на сервере и путь к файлу на сохранение.

Какой командой можно узнать размер файла на сервере???
Indy не предлагать!!!


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Bima
Дата 14.12.2006, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Дали мне тут ссылку на проект, который на дельфи написан. Пытался его преоброзовать и вот что вышло:
Код

//---------------------------------------------------------------------------
#include <memory>
#include <vcl.h>
#include <urlmon.h>
#pragma comment(lib,"urlmon.lib")

#pragma hdrstop

#include "Kod.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DWORD GetInetFileSize(AnsiString url);
AnsiString myUrl="http://www.biminc.narod.ru/Test.zip";
AnsiString MyFile="c:\\Test.zip";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int retcode;
retcode = URLDownloadToFile( NULL, myUrl.c_str(), MyFile.c_str(), 0, 0 );
Label1->Caption=IntToStr(retcode);
}
//---------------------------------------------------------------------------
DWORD GetInetFileSize(AnsiString url)
{
long *hInet, *hUrl;
DWORD nSize, nBuffLen, nIndex;

hInet = InternetOpen("Mozilla",
                     INTERNET_OPEN_TYPE_PRECONFIG,
                     NULL,
                     NULL,
                     0);
if (hInet != NULL)
   {
   ShowMessage(IntToStr(Integer(hInet)));
   hUrl = InternetOpenUrl(hInet,
                          url.c_str(),
                          NULL,
                          0,
                          INTERNET_FLAG_RELOAD,
                          0);
   ShowMessage(IntToStr(Integer(hUrl)));
   if (hUrl != NULL)
      {
      nIndex =  0;
      nBuffLen = sizeof(nSize);
      if (HttpQueryInfo(hUrl, HTTP_QUERY_CONTENT_LENGTH || HTTP_QUERY_FLAG_NUMBER, &nSize, nBuffLen, nIndex))
         ShowMessage("File size: "+IntToStr(nSize));
      else
         nSize = 0;
      InternetCloseHandle(hUrl);
      }
   InternetCloseHandle(hInet);
   }
return nSize;
}
//---------------------------------------------------------------------------

после компиляции, ВСВ выдает ошибки:
  [C++ Error] Kod.cpp(33): E2034 Cannot convert 'void *' to 'long *'
  [C++ Error] Kod.cpp(41): E2034 Cannot convert 'void *' to 'long *'
  [C++ Error] Kod.cpp(52): E2034 Cannot convert 'unsigned long' to 'unsigned long *'
  [C++ Error] Kod.cpp(52): E2342 Type mismatch in parameter 'lpdwBufferLength' (wanted 'unsigned long *', got 'unsigned long')
  [C++ Error] Kod.cpp(52): E2034 Cannot convert 'unsigned long' to 'unsigned long *'
  [C++ Error] Kod.cpp(52): E2342 Type mismatch in parameter 'lpdwIndex' (wanted 'unsigned long *', got 'unsigned long')
  [C++ Warning] Kod.cpp(61): W8004 'nIndex' is assigned a value that is never used
  [C++ Warning] Kod.cpp(61): W8004 'nBuffLen' is assigned a value that is never used
ВСВ ругается на несоответствие типов (long *hInet, *hUrl). В исходном проекте там стояло:
hInet, hUrl: HInternet;
но ВСВ не понимает такой тип переменных как HInternet.

Как мне быть? Помогите преобразовать код к нормальному виду.


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
Bima
Дата 15.12.2006, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



После долгих проб получил следующий код:
Код

//---------------------------------------------------------------------------
//#include <memory>
#include <vcl.h>
#include <urlmon.h>
#pragma comment(lib,"urlmon.lib")
#include <wininet.h>
#pragma comment(lib,"wininet.lib")

#include "Kod.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
DWORD GetInetFileSize(AnsiString url);
AnsiString myUrl="http://www.biminc.narod.ru/Test.zip";
AnsiString MyFile="c:\\Test.zip";
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner){}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int retcode;
retcode = URLDownloadToFile( NULL, myUrl.c_str(), MyFile.c_str(), 0, 0 );
Label1->Caption=IntToStr(retcode);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
DWORD a;
a=GetInetFileSize(myUrl);
Label1->Caption=IntToStr(a);
}
//---------------------------------------------------------------------------
DWORD GetInetFileSize(AnsiString url)
{
HINTERNET hInet, hUrl;
DWORD nSize, nBuffLen;
unsigned long nIndex;

hInet = InternetOpen("Microsoft Internet Explorer",
                     INTERNET_OPEN_TYPE_PRECONFIG,
                     NULL,
                     NULL,
                     0);
if (hInet != NULL)
   {
   ShowMessage("hInet="+IntToStr(Integer(hInet)));
   hUrl = InternetOpenUrl(hInet,
                          url.c_str(),
                          NULL,
                          0,
                          INTERNET_FLAG_RELOAD,
                          0);
   ShowMessage("hUrl="+IntToStr(Integer(hUrl)));
   if (hUrl != NULL)
      {
      nIndex =  0;
      nBuffLen = sizeof(nSize);
      if (HttpQueryInfo(hUrl,
                        HTTP_QUERY_CONTENT_LENGTH || HTTP_QUERY_FLAG_NUMBER,
                        &nSize,
                        &nBuffLen,
                        &nIndex))
         ShowMessage("File size: "+IntToStr(nSize));
      else
         nSize = 0;
      InternetCloseHandle(hUrl);
      }
   InternetCloseHandle(hInet);
   }
return nSize;
}
//---------------------------------------------------------------------------

Только вот не могу понять почему я всегда получаю 0 байт при запросе размера файла.
если рассмотреть функцию GetInetFileSize, то внутри ее InternetOpen и InternetOpenUrl выполняются успешно (ShowMessage показывает их значения), а вот функция HttpQueryInfo возвращает false и естественно размер я получаю 0.
Как быть, может синтакс у HttpQueryInfo неправильный???


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.12.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(Bima @  15.12.2006,  10:53 Найти цитируемый пост)
Как быть, может синтакс у HttpQueryInfo неправильный???

синтаксис правильный. ты ее вызываеш неправильно...
третьим параметром что должно быть? а у тебя что?..
Цитата(Bima @  15.12.2006,  10:53 Найти цитируемый пост)
а вот функция HttpQueryInfo возвращает false

дык:
Цитата

Return Values
Returns TRUE if successful, or FALSE otherwise. To get extended error information, call GetLastError.


Добавлено @ 12:31 
и в последний с какого-то перепуга 0 передаеш... ты до этого где-то content length опрашиваеш? так зачем?..


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bima
Дата 15.12.2006, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

синтаксис правильный. ты ее вызываеш неправильно...
третьим параметром что должно быть? а у тебя что?..

Вот информация с MSDN:
Цитата

HttpQueryInfo
Retrieves header information associated with an HTTP request.

BOOL HttpQueryInfo(
  HINTERNET hRequest,
  DWORD dwInfoLevel,
  LPVOID lpvBuffer,
  LPDWORD lpdwBufferLength,
  LPDWORD lpdwIndex
);

Parameters
hRequest 
[in] Handle returned by HttpOpenRequest or InternetOpenUrl. 
dwInfoLevel 
[in] Combination of an attribute to be retrieved and flags that modify the request. For a list of possible attribute and modifier values, see Query Info Flags. 
lpvBuffer 
[in, out] Pointer to a buffer to receive the requested information. This parameter must not be NULL. 
lpdwBufferLength 
[in, out] Pointer to a variable that contains, on entry, the size in bytes of the buffer pointed to by lpvBuffer. 
When the function returns successfully, this variable contains the number of bytes of information written to the buffer. In the case of a string, the byte count does not include the string's terminating null character.

When the function fails with an extended error code of ERROR_INSUFFICIENT_BUFFER, the variable pointed to by lpdwBufferLength contains on exit the size, in bytes, of a buffer large enough to receive the requested information. The calling application can then allocate a buffer of this size or larger, and call the function again.

lpdwIndex 
[in, out] Pointer to a zero-based header index used to enumerate multiple headers with the same name. When calling the function, this parameter is the index of the specified header to return. When the function returns, this parameter is the index of the next header. If the next index cannot be found, ERROR_HTTP_HEADER_NOT_FOUND is returned. 


Третьим параметром идет LPVOID lpvBuffer и я ставлю туда переменную, которую потом читаю nSize.

Цитата

и в последний с какого-то перепуга 0 передаеш... ты до этого где-то content length опрашиваеш? так зачем?.. 

я не понимаю, о чем здесь речь, если о строке nIndex =  0;, то это я с примера взял, который на дельфях был написан. Насколько я понял, функция вернет туда указатель на следующийи заголовок. Если я не прав, то как мне поправить???

я в else последний поставил вот такую инструкцию:
Код

   if (HttpQueryInfo(hUrl,
                        HTTP_QUERY_CONTENT_LENGTH || HTTP_QUERY_FLAG_NUMBER,
                        &nSize,
                        &nBuffLen,
                        &nIndex))
         ShowMessage("File size: "+IntToStr(nSize));
      else
         {
         MessageBoxA(Application->Handle , SysErrorMessage(GetLastError()).c_str(), "Error", 16);
         nSize = 0;
         }

и у меня выскаивает сообщение "Область данных, переданная по системному вызову, слишком мала". С чем это может быть связано?


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.12.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(Bima @  15.12.2006,  13:29 Найти цитируемый пост)
Третьим параметром идет LPVOID lpvBuffer и я ставлю туда переменную, которую потом читаю nSize.

дык русским же языком написанно -- буффер. а ты что передаеш? -- DWORD (целых 4 байта)...
(о чем, кстати, и сообщает нам ось)
насчет nIndex (не знаю (и лень искать) просто ли там 0 написан или так же передается переменная (в чем сомневаюсь)) -- пиши там просто NULL


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Bima
Дата 15.12.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



а что переменная не может быть буфером???
Я не догоняю что-то.
Как мне использовать этот буфер и как его создать???

Насчет nIndex учту, поробую NULL


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
_hunter
Дата 15.12.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98



Цитата(Bima @  15.12.2006,  14:29 Найти цитируемый пост)
а что переменная не может быть буфером???

может. если ты уверен что данные туда влезут. в твоем случае не влезают.
Цитата(Bima @  15.12.2006,  14:29 Найти цитируемый пост)
Я не догоняю что-то.Как мне использовать этот буфер и как его создать???

шутим? если нет -- рановато ты в WinInet полез...
char buffer[1024];
и дальше по-логике...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
codelord
Дата 15.12.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 777
Регистрация: 7.5.2005
Где: ты моя темноглаза я где?!

Репутация: 16
Всего: 39



вот попробуй , было любопытно.
Код

__int64  GetUFileSize(char *url)
      {
         char nSize[32];
         DWORD nBuffLen;
         __int64 size;
         nBuffLen=sizeof(nSize);
         HINTERNET hUrl, hOpen;
         hOpen = InternetOpen("YOUR_AGENT",NULL,NULL,NULL,NULL);
         hUrl = InternetOpenUrl(hOpen,url,NULL,NULL,NULL,NULL);
         if (HttpQueryInfo(hUrl,
                        HTTP_QUERY_CONTENT_LENGTH,// || HTTP_QUERY_FLAG_NUMBER,
                        &nSize,
                        &nBuffLen,
                        0))
         ShowMessage("File size: "+AnsiString(nSize));
         else
           {
            MessageBoxA(Application->Handle , SysErrorMessage(GetLastError()).c_str(), "Error", 16);
            }
         InternetCloseHandle(hOpen);
         InternetCloseHandle(hUrl);

         size=StrToInt(AnsiString(nSize));
         return size;
      }


проверок как можно видеть не делал.

Это сообщение отредактировал(а) codelord - 15.12.2006, 18:18


--------------------
Доступен поиск по исходным кодам в GOOGLE.
http://www.google.com/codesearch
PM MAIL   Вверх
Bima
Дата 15.12.2006, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 15.8.2006

Репутация: 2
Всего: 2



Цитата

>>а что переменная не может быть буфером???
может. если ты уверен что данные туда влезут. в твоем случае не влезают.

Интересно получается, для того, что бы получить число 136 (размер файла), нужно использовать переменную длиной в 1 кб??? А я думал, что 4 байтная переменная может уместить 65535. В таком случае можно было использовать  8 битную переменную, типа double для 4 гигабайтной размерности (4294967295). 
Цитата

шутим? если нет -- рановато ты в WinInet полез...
char buffer[1024];
и дальше по-логике...

Нет, я не шутил. Каждый по своему понимает... я не понял, что нужно использовать буфер char для того, что бы получить число  smile 

codelord большое спасибо за код. Я взял его недостоющие моменты и вставил в свой код. Уже испытал его, все заработало (лови репутацию +1). 

Всем спасибо, кто откликнулся. Тема закрыта.

Это сообщение отредактировал(а) Bima - 15.12.2006, 20:15


--------------------
Чтобы дойти до цели, надо идти.

Клавиатура и мышь - это главные инструменты прогресса.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1043 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.