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

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

Как узнать существует ли файл на сайте [D7, NT4, 2000, XP, 2003]


Люди ©   (2006-01-13 02:46:00) 

Нужно узнатьесть ли файл на сайте. Вот Код который я использую:

NetHandle := InternetOpen('Microsoft Internet Explorer 6.0', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if Assigned(NetHandle) then
 for i:= 0 to 20 do
 begin
   if i < 10 then
     url:='0'+IntToStr(i)
   else
     url:=IntToStr(i);
   FileName := 'C:\Save\asd'+url+'.rar';
   url := ' http://www.___.ru/asd'+url+'.rar';
(*1*)    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
     if Assigned(UrlHandle) then
       begin { UrlHandle правильный? Начинаем загрузку }
          FillChar(Buffer, SizeOf(Buffer), 0);
          AssignFile(f,FileName);
          ReWrite(f,1);
          repeat
            FillChar(Buffer, SizeOf(Buffer), 0);
            InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
            BlockWrite(f, Buffer, BytesRead);
          until BytesRead = 0;
          Buffer:='' ;   BytesRead := 0; // Думал это поможет
          InternetCloseHandle(UrlHandle);  UrlHandle := 0; // Думал это поможет
          Close(f);
        end
      else
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
         showMessage('Нет Урлы');
//          raise Exception.CreateFmt('Cannot open URL %s', [Url]);
  end
 else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
   raise Exception.Create('Unable to initialize Wininet');
  InternetCloseHandle(NetHandle); // закрываем сессию


Скачен код помоему отсюда.

В точке (*1*), если файла не существует, он UrlHandle не равен 0. А значит понимает что он(файл) существует. И качает и откуда-то выкачивает 7кБ - отбросы инета чтоли :-)

Может кто подскажет как определить есть ли файл на сайте.

И если можно, то как определить размер файла до скачивания(для прогресбара), а то после скачивания и так можно узнать. Может определение размера даст некоторый ответ о существовании файла?


STK   (2006-01-18 01:34:00) [1]

Жду ответа, а ответа так и нет, а так охота доделать программу.


STK   (2006-01-17 00:56:00) [2]


> palva ©   (15.01.06 01:21) [18]
> > Вот как узнать перед загрузкой что файла нет
> А почему вас не устраивает то, что при попытке разгружать
> вы получаете 7 кб и определяете, что файла нет. Вас что
> излишний траффик напрягает? Тогда прочитайте только заголовки
> и убедитесь, что Content-type равен rar/application или
> что там вы хотите получить и тогда разгружайте файл.

В кратце хотя бы, как у файла найти Content-type? или у кого там. Как я понял это гдето в заголовке файла. Но как именно найти, а?

И по поводу определения размера файла, как узнать.

И ещё один вопрос: В программе иногда пишут Application.ProcessMessage(или что-то типа того) - как я понял это обработка каких-то сообщений в долгой процедуре. А как это реализовать в потоке(скачка файлов производится в потоке), или в этом нет необходимости? Потому что потоку вроде как пофиг на сообщения, или я не прав? А дело в том, что в примере, откуда я взял код, в участке кода где идёт запись файла на диск стоит Application.ProcessMessage. Вот незнаю что и делать. Подскажите пожалуйста.


palva   (2006-01-15 01:21:00) [3]

> Вот как узнать перед загрузкой что файла нет
А почему вас не устраивает то, что при попытке разгружать вы получаете 7 кб и определяете, что файла нет. Вас что излишний траффик напрягает? Тогда прочитайте только заголовки и убедитесь, что Content-type равен rar/application или что там вы хотите получить и тогда разгружайте файл.


Джо   (2006-01-15 00:41:00) [4]

> [16] STK ©   (14.01.06 23:38)

Ну, именно об этом и говорилось выше.


STK   (2006-01-14 23:38:00) [5]

Взамен файла, которого не существует, приходит чистой воды файл html, но с сайта drweb, т.е. лично от них все ссылки и всё такое на странице. И извенения мол нет и не знают где.


STK   (2006-01-14 23:29:00) [6]


> palva ©   (14.01.06 12:23) [13]
> Проблема не очень понятна. Вы послали серверу запрос, он
> вернул вам заголовки и файл. Что требуется дальше?

Проблема в том что если я запрашиваю файл которого не существует, то он мне на 7 кБ присылает инфу(файл), здесь мне сказали что это обычная html с кодом ошибки 404 - ну она нам всем знакома (aqkf не существует). Вот как узнать перед загрузкой что файла нет, что его не качать, вот в чём проблема.


> Anatoly Podgoretsky ©   (14.01.06 16:56) [14]
> Не работает HTTP протокол с файлами, только со страницами,
>  притом страницу надо указывать явно, узнать есть она или
> нет не существует возможности, часто они формируются динамически.
>

Могу Вас уверить что я качал файлы. 100% они приходят, кого я просил.

Пойду щас проверю что это за 7 кБ такие - чтоб точно знать.


Anatoly Podgoretsky   (2006-01-14 16:56:00) [7]

Не работает HTTP протокол с файлами, только со страницами, притом страницу надо указывать явно, узнать есть она или нет не существует возможности, часто они формируются динамически.


palva   (2006-01-14 12:23:00) [8]

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


STK   (2006-01-14 03:38:00) [9]

Теперь меня преследует ник Люди. ноя ведь STK


Люди   (2006-01-14 03:34:00) [10]


> Джо ©   (14.01.06 03:16) [10]
Http-сервер хоть администрировать можешь?Там несложный скрипт можно тогда написать для отдачи либо заказанного файла, либо страницы определенного шаблона для индикации ошибки.

Это уже за рамками. Смотри
> STK ©   (13.01.06 21:22) [8]

Там и так понятно. Администрировать не имею право, кто мне его даст.

> Если сервер — твой, то поднимаешь на нем FTP-server. А доступ
> к нему можно получать хоть бы и с помощью функций из WinInet.
> pas. Там их для ftp много всяких, в том числе и проверка
> наличия файла.
> Если сервер — не твой, то тут и советовать нечего. Это вариант
> отпадает.

ftp не мой, паролей не знаю. Уверен ведь, такой код использовали многие.

Нет всёже я думаю придётся эти архивы проверять после загрузки на компЮтер. Они всёж не по десяткам метров весят. Но всё таки интересно как это сделать.
Смотрел WinInet - нечего не дало. Вот я думаю может проверять первый кусок, размер его 1кб - если есть подпись как у архива, то ГУТ, если чтото похоже на HTML(страница ошибки с кодом 404) - то вот он и ответ.

>Джо
Как думаеш сработает? Но я попробую, только вот как разобраться с первым куском вот это новая проблема.


Джо   (2006-01-14 03:16:00) [11]

> [8] STK ©   (13.01.06 21:22)
> Может подскажеш, как её реализовать.

Если сервер — твой, то поднимаешь на нем FTP-server. А доступ к нему можно получать хоть бы и с помощью функций из WinInet.pas. Там их для ftp много всяких, в том числе и проверка наличия файла.
Если сервер — не твой, то тут и советовать нечего. Это вариант отпадает.
---
Http-сервер хоть администрировать можешь? Там несложный скрипт можно тогда написать для отдачи либо заказанного файла, либо страницы определенного шаблона для индикации ошибки.


Люди   (2006-01-14 03:05:00) [12]

Народ помогите.
STK = Люди. Просто попросил друга создать ветку, а он подписался не зная мой ник. Так вот: STK это Люди.


STK   (2006-01-13 21:22:00) [13]

Всем спасибо за ответы, хоть что-то.

> Джо ©   (13.01.06 13:40) [5]
> Если есть возможность, то лучше перейти на протокол FTP,
>  гораздо проще там с файлами работать, для того и был разработан,
>  в отличие от HTTP.

Может подскажеш, как её реализовать. Но мне не надо заумного чтото делать. Я же не Качалку пишу а так обновитель файлов. Одним словом вирусных баз с DrWeb. они весят то не более 85 или 20 кБ. и на сайте их больше 50 наверно и не будет. Даже к выходу новой версии. А занимает по времени не более 2 минут на десяток первых.
Может кто делал что-то подобное, помогите.


STK   (2006-01-13 21:14:00) [14]


> Джо ©   (13.01.06 03:10) [2]
>
> Разумеется. Веб-сервер передает тебе страницу, на которой
> написано «Error 404», а вовсе не мусор :)


А как можно определить что он именно её отправил, а не файл?
====================

> palva ©   (13.01.06 12:27) [3]
> Нужно проверять заголовки. Там должен быть код 200, а не
> 404 500 или еще что-нибудь. В заголовках еще можно увидеть
> тип файла (страница это картинка или архив), кодировку текста,
>  если это текст длину, дату и многое другое. Как прочитать
> заголовки - не скажу, потому что не знаю что такое InternetOpen.
>


А где можно найти объяснение кода возврата, может в модуле WinInet. Но я искал что-то не нашёл, правда искал так не подробно.


DiamondShark   (2006-01-13 13:58:00) [15]

Никак не узнать.
Хотя бы по той простой причине, что в HTTP протоколе вообще отсутсвует понятие "файл".

Можно проверять статус ответа.
Другое дело, что некоторые сервера не возвращают статус ошибки.


Джо   (2006-01-13 13:40:00) [16]

Если есть возможность, то лучше перейти на протокол FTP, гораздо проще там с файлами работать, для того и был разработан, в отличие от HTTP.


Reindeer Moss Eater   (2006-01-13 12:28:00) [17]

Если сервер верну двести, это еще не значит, что на сайте есть какой-то там файл.


palva   (2006-01-13 12:27:00) [18]

Нужно проверять заголовки. Там должен быть код 200, а не 404 500 или еще что-нибудь. В заголовках еще можно увидеть тип файла (страница это картинка или архив), кодировку текста, если это текст длину, дату и многое другое. Как прочитать заголовки - не скажу, потому что не знаю что такое InternetOpen.


Джо   (2006-01-13 03:10:00) [19]

> А значит понимает что он(файл) существует. И качает и откуда-
> то выкачивает 7кБ - отбросы инета чтоли :-)

Разумеется. Веб-сервер передает тебе страницу, на которой написано «Error 404», а вовсе не мусор :)


STK   (2006-01-13 02:51:00) [20]

Может кто подскажет ссылочку, или пример подбросит.


Наверх

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