Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получение размера удалённого файла без его скачивания.


Maks Realov ©   (2003-08-06 14:15:00) 

Как программно получить размер файла, который лежит на www.somesite.com/dir, т.е. www.somesite.com/dir/file1.zip ?
Естественно, без предварительного скачивания данного файла.

Спасибо.


Е-Моё имя   (2003-08-06 17:14:00) [1]

Anatoly Podgoretsky © (06.08.03 16:44)
гыыы))
бывает же такое)


Anatoly Podgoretsky   (2003-08-06 16:58:00) [2]

xShadow © (06.08.03 16:32)
Остальное не важно, требуется обращение к серверу с коандой HEAD, что и делается через WinInet.dll функцией HttpQueryInfo, это уже с разбором заголовка.

Единственная проблема, что нет гарантиии получения размера или этот размер может быть неверным.


Aleksey Pavlov   (2003-08-06 16:52:00) [3]

>>Maks Realov:
Бага тривиальная память невыделена у тебя:

function GetUrlInfo(const FileURL: String): Integer;
var
hSession, hFile: hInternet;
dwBuffer: PChar;
dwBufferLen, dwIndex: DWORD;
TempS: String;
begin
Result:= 0;
dwBuffer:= StrAlloc(255*SizeOf(Char));
hSession:= InternetOpen("WebClient", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(hSession) then
begin
hFile:= InternetOpenURL(hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
dwIndex:= 0;
dwBufferLen:= 20;
if HttpQueryInfo(hFile, HTTP_QUERY_CONTENT_LENGTH, dwBuffer, dwBufferLen, dwIndex) then
begin
TempS:= StrPas(dwBuffer);
Result:= StrToInt(TempS);
end;
ShowMessage(IntToStr(GetLastError));
if Assigned(hFile) then
InternetCloseHandle(hFile);
InternetCloseHandle(hsession);
end;
StrDispose(dwBuffer);
end;


Maks Realov   (2003-08-06 16:46:00) [4]

Да, про этот код.
А какие остальные параметры?
Прокся есть, но она для меня прозрачна, т.е. я напрямую обращаюсь к 80-му порту. В IE никаких спец. настроек нет.


Anatoly Podgoretsky   (2003-08-06 16:44:00) [5]

Е-Моё имя © (06.08.03 16:04)
Часто встречаю расшаренные папки идаже с полным доступом, так что по приведенному адресу судить нельзя, вот если бы было написано с указанием протокола http://www.somesite.com/dir/file1.zipто тогда бы вопроса не возникло.


xShadow   (2003-08-06 16:34:00) [6]

Maks Realov
Это про код который я привёл ?
А остальные параметры какие??
Есть ли прокси сервер? Постоянно ли ты подключен к инету ?


xShadow   (2003-08-06 16:34:00) [7]

Пардон глюки :(
Проксю есть?


Maks Realov   (2003-08-06 16:33:00) [8]

В WinError.h:
#define ERROR_INVALID_SHARENAME 1215L

Я задаю URL так: http://mysrv.serv.ru/myfile.zip


xShadow   (2003-08-06 16:32:00) [9]

Maks Realov
Это про код который я привёл ?
А остальные параметры какие??
Есть ли прокси сервер? Постоянно ли ты подключен к инету ?


Maks Realov   (2003-08-06 16:30:00) [10]

xShadow:

HttpQueryInfo всегда возвращает False, а GetLastError даёт значение 12150.


Е-Моё имя   (2003-08-06 16:04:00) [11]

Anatoly Podgoretsky © (06.08.03 14:40)

о типе сервера судил по приведенному примеру адреса
типичный http адрес )


xShadow   (2003-08-06 15:29:00) [12]

Function GetUrlInfo( const FileURL: String ): Integer;
var hSession, hFile: hInternet;
dwBuffer: PChar;
dwBufferLen, dwIndex: DWORD;
TempS: String;
Begin
Result := 0;
hSession := InternetOpen( "xShadow downlaod inf", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned( hSession ) then
Begin
hFile := InternetOpenURL( hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
dwIndex := 0;
dwBufferLen := 20;
if HttpQueryInfo( hFile, HTTP_QUERY_CONTENT_LENGTH, dwBuffer, dwBufferLen, dwIndex) then
Begin
TempS := StrPas( dwBuffer );
Result := StrToInt( TempS );
end;
if Assigned( hFile ) then InternetCloseHandle(hFile);
( hsession)

Function GetUrlInfo( const FileURL: String ): Integer;
var hSession, hFile: hInternet;
dwBuffer: PChar;
dwBufferLen, dwIndex: DWORD;
TempS: String;
Begin
Result := 0;
hSession := InternetOpen( "xShadow downlaod inf", INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned( hSession ) then
Begin
hFile := InternetOpenURL( hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
dwIndex := 0;
dwBufferLen := 20;
if HttpQueryInfo( hFile, HTTP_QUERY_CONTENT_LENGTH, dwBuffer, dwBufferLen, dwIndex) then
Begin
TempS := StrPas( dwBuffer );
Result := StrToInt( TempS );
end;
if Assigned( hFile ) then InternetCloseHandle(hFile);
InternetCloseHandle(hsession);
end;
end;


Вот кусок должен работать его предназначение вернуть размер http ссылки или файла. Проверялось только на файлах


Maks Realov   (2003-08-06 14:45:00) [13]

Вообще говоря, я пользуюсь функцией URLDownloadToFile для скачивания файлов. Так что качаю через http протокол. Это так - к сведению.


Anatoly Podgoretsky   (2003-08-06 14:40:00) [14]

А может у него ftp протокол или расшаренная папка.


Е-Моё имя   (2003-08-06 14:36:00) [15]

метод http HEAD
получает заголовки, там есть длина ресурса, если ее можно вычислить


Наверх

Титульная страница Поиск, карта сайта Написать письмо