Интернет решения от доктора Боба - страница 23
>
> end.
Примечание, для того, что бы упростить, мы не используем базу данных для хранения комментариев. Иначе это потребовало установки BDE на web сервере.
3.4.3. Детектор мертвых ссылок
Любой серьезный web сайт и его web мастер должны всегда следить за актуальность ссылок. И если обнаружится мертвая ссылка (например другой web сайт прекратил существование), но нет никаких оправданий для внутренних мертвых ссылок. И поэтому я написал простую программу, назвав ее HTMLINKS, которая может сканировать .HTM файлы на их присутствие на локальной машине. (что бы потом загрузить их на сервер). HTM файлы из текущего каталога и всех подкаталогов рекурсивно читаются и проверяются на тег " Заметим, что программа игнорирует все "file://", "ftp://", "mailto:", "news:" and ".exe?" значения если они встретятся внутри "HREF" части. Конечно, вы свободны в расширить HTMLINKS для проверки и этих случаев, можно также реализовать проверку и внешних ссылок. Для информации я написал и детектор внешних мертвых ссылок в статье для The Delphi Magazine, подробности можно найти на моем web сайте. Для анализа мертвых локальных ссылок код следующий:> {$APPTYPE CONSOLE}
> {$I-,H+}
> uses
> SysUtils;
> var
> Path: String;
> procedure CheckHTML(const Path: String);
> var
> SRec: TSearchRec;
> Str: String;
> f: Text;
> begin
> if FindFirst('*.htm', faArchive, SRec) = 0 then
> repeat
> Assign(f,SRec.Name);
> Reset(f);
> if IOResult = 0 then { no error }
> while not eof(f) do
> begin
> readln(f,Str);
> while (Pos('do
> begin
> else
> Delete(Str,1,Pos('FRAME SRC="',Str)+10);
> if (Pos('#',Str) <> 1) and
> (Pos('http://',Str) <> 1) and
> (Pos('mailto:',Str) <> 1) and
> (Pos('news:',Str) <> 1) and
> (Pos('ftp://',Str) <> 1) and
> (Pos('.exe?',Str) = 0) then { skip external links & exe }
> begin
> if Pos('file:///',Str) = 1 then Delete(Str,1,8);
> if (Pos('#',Str) 0) and
> (Pos('#',Str) < Pos('"',Str)) then Str[Pos('#',Str)] := '"';
> if not FileExists(Copy(Str,1,Pos('"',Str)-1)) then
> writeln(Path,'\',SRec.Name,': [',Copy(Str,1,Pos('"',Str)-1),']')
> end
> end
> end;
> Close(f);
> if IOResult <> 0 then { skip }
> until FindNext(SRec) <> 0;
> FindClose(SRec);
> // check sub-directories recursively
> if FindFirst('*.*', faDirectory, SRec) = 0 then
> repeat
> if ((SRec.Attr AND faDirectory) = faDirectory) and
> (SRec.Name[1] <> '.') then
> begin
> ChDir(SRec.Name);
> CheckHTML(Path+'\'+SRec.Name);
> ChDir('..')
> end
> until FindNext(SRec) <> 0;
> FindClose(SRec)
> end {CheckHTML};
> begin
> writeln('HTMLinks 4.0 (c) 1997-2000 by Bob Swart (aka Dr.Bob - www.drbob42.com)');
> writeln;
> FileMode := $40;
> GetDir(0,Path);
> CheckHTML(Path)
> end.
3.4.4. FTP Upload/Download
Иногда вам просто нужно загружать файлы из Интернета. В терминах Интернета, это означает, что вам нужно использовать FTP клиента. И если вы не желаете, подобно мне использовать настоящего FTP клиента, то просто напишите, как и я своего собственного клиента…
3.4.4.1. FTP
Как я сказал во введении, FTP означает File Transfer Protocol, который описан в which RFC 959. Модель связи FTP может быть реализована с помощью сокетов, но это более низкоуровневое решение и если вы посмотрите спецификацию, то поймети, что написание программы FTP клиента с нуля не такая уж простая задача. С другой стороны, мы можем использовать NetManage TFTP компонент из Delphi 2.01 (и выше) и C++Builder. Я пробовал использовать этот компонент несколько раз, и нашел его просто глюкавым, особенно для файлов свыше 10 Kb. Я могу понять, почему Microsoft (первый разработчик Internet Solutions Pack) не захотела использовать его и продала затем NetManage, которая тоже не справилась с ним и продала далее фирме NetMasters. Проблема в том, что Internet Solutions Pack – хотя и бесплатный – основан на наборе с ограничениями ActiveX, и каждая компания которая использует его также имеет более лучшее решение (обычно не бесплатно). Поддержка и документация всегда отвратительная…