Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Как узнать существует ли файл на сайте   Найти похожие ветки 

 
Люди   (2006-01-13 02:46) [0]

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

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-13 02:51) [1]

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


 
Джо ©   (2006-01-13 03:10) [2]

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

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


 
palva ©   (2006-01-13 12:27) [3]

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


 
Reindeer Moss Eater ©   (2006-01-13 12:28) [4]

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


 
Джо ©   (2006-01-13 13:40) [5]

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


 
DiamondShark ©   (2006-01-13 13:58) [6]

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

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


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


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


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

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


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


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

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

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

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


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

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


 
Джо ©   (2006-01-14 03:16) [10]

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

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


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


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

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

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

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

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

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

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


 
STK ©   (2006-01-14 03:38) [12]

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


 
palva ©   (2006-01-14 12:23) [13]

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


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

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


 
STK ©   (2006-01-14 23:29) [15]


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

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


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

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

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


 
STK ©   (2006-01-14 23:38) [16]

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


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

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

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


 
palva ©   (2006-01-15 01:21) [18]

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


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


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

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

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

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


 
STK ©   (2006-01-18 01:34) [20]

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



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.06 c
2-1137476418
Dot
2006-01-17 08:40
2006.02.05
выборка из таблицы в StringGrid


1-1136415242
woo
2006-01-05 01:54
2006.02.05
Сравнение докумнетов Word


15-1136964501
msguns
2006-01-11 10:28
2006.02.05
Телевидение. Что изменилось


2-1137480059
Id
2006-01-17 09:40
2006.02.05
DateEdit


15-1137501483
Yeg
2006-01-17 15:38
2006.02.05
Запуск программы...