|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
вывести количество и суммарный размер всех файлов сервера
(Delphi 7) Необходимо реализовать следующее задание: Определить и вывести количество и суммарный размер всех файлов сервера, не являющихся HTML-документами и рисунками. Вывести их список.
Фишка состоит в том что программа должна все это выполнять через HTTP протокол. Помогите пожалуйста я в этом просто новичок. Бьюсь уже три дня и все бес толку. Заранее благодарен!!! Последний раз редактировалось Comp-1984, 16.06.2009 в 12:13. |
#2
|
|||
|
|||
Не сомсем понятно, что надо сделать. Дело в том, что если на сервере кроме Web-сервера ничего нет (ну, в смысле другого доступа нет), то ты сможешь получить только файлы, на которые есть ссылки с тех самых html-страниц. Это делается достаточно легко.
А вот если тебе надо реальное положение дел, то придется на сервер ставить демона, который умеет отдавать эту информацию по какому-либо порту и просто обращаться к нему, а уж сам демон (сервис) будет эту информацию получать средстами чтения файловой системы. Так что определись что тебе реально нужно... |
#3
|
|||
|
|||
Через гипер ссылки
Получается через HTTP протокол я не как не смогу узнать суммарный размер всех файлов сервера, не являющихся HTML-документами и рисунками? Если не трудно размести пример со ссылками! Спасибо!
|
#4
|
|||
|
|||
Вот есть пример другой задачи!!!
Определить и вывести суммарный размер всех страниц www-сервера и их количество. Вывести адреса страниц, имеющих наибольший и наименьший размер.
unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Psock, NMHttp, StdCtrls; type TfrmMain = class(TForm) edHost: TEdit; edPort: TEdit; NMHTTP: TNMHTTP; memResult: TMemo; btnAnalysis: TButton; btnQuit: TButton; lbNumber: TLabel; lbSize: TLabel; lbMax: TLabel; lbMin: TLabel; lbMaxSize: TLabel; lbMinSize: TLabel; GroupBox1: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label10: TLabel; Label4: TLabel; Label6: TLabel; Label8: TLabel; procedure btnQuitClick(Sender: TObject); procedure btnAnalysisClick(Sender: TObject); procedure NMHTTPSuccess(Cmd: CmdType); private procedure GetLinks(Txt:string); public end; var frmMain: TfrmMain; CommonSize, //Суммарный размер страниц MinSize, //Размер минимаоьной страницы MaxSize, //Размер максимальной страницы PageNumber:integer; //Кол-во страниц Host, //Адрес сервера Current, //Адрес текущей страницы MinLink, //Адрес минимальной страницы MaxLink:string; //Адрес максимальной страницы implementation {$R *.dfm} //Функция обрезает строку до последнего слеша function CutLeft(S:string):string; var i:integer; begin i:=length(S); while (i>1) and (S[i]<>'/') do dec(i); Result:=copy(S,1,i-1); end; {Функция проверяет ссылку на принадлежность серверу и при необходимости дополняет до полного адреса Результат: True - если ссылка принадлежит сайту.} function TestLink(var Link:string):boolean; var Buff:string; begin Buff:=Current; Result:=False; if Link[1]='/' then //Если ссылка начинается с / begin //Формирование полного адреса Link:=Host+'/'+copy(Link,2,length(Link)-1); Result:=True; end; if not Result and (copy(Link,1,2)='..') then //Если начинается с .. begin while copy(Link,1,2)='..' do begin //Переход на родительскую страницу Link:=copy(Link,4,length(Link)-3); Buff:=CutLeft(Buff); end; Link:=Buff+'/'+Link; Result:=True; end; if not Result and (Link[1]='.') then // Если начинается с . begin while copy(Link,1,2)='./' do //Отсекаем все ./ слева Link:=copy(Link,3,length(Link)-2); Link:=CutLeft(Buff)+'/'+Link; //Формируем полный адрес Result:=True; end; if not Result then if (copy(Link,1,7)='http://') then //Если это полный адрес, то Result:=pos(Host,Link)=1 //проверка - это наш сайт? else begin Link:=CutLeft(Buff)+'/'+Link; //Если адрес не полный, то Result:=True; //формируем адрес от текущей страницы end; if pos('#',Link)>0 then //Если есть индекс, то Link:=copy(Link,1,pos('#',Link)-1);//удаляем его Buff:=copy(Link,length(Link)-3,4); //Прямые ссылки на рисунки if Result then //не рассматриваем Result:=not ((Buff='.jpg') or (Buff='.gif') or (Buff='.png') or (Buff='jpeg') or (Buff='.bmp')); end; {Процедура выделяет из тела страницы ссылки и при необходимости добавляет из в список memResult} procedure TfrmMain.GetLinks(Txt:string); var Buff, //Буфер Link:string; //Выделенная ссылка i,j:integer; //Вспомогательные переменные для индексирования Flag:boolean;//Признак, что ссылка уже есть в списке begin Buff:=Txt; i:=pos('<',Buff); //Ищем символ < while i>0 do //Пока находятся begin Buff:=trim(copy(Buff,i+1,length(Buff)-i)); if (Buff<>'') and (Buff[1]='a') then //Проверка - это тэг адреса begin Buff:=trim(copy(Buff,2,length(Buff)-1)); if pos('href',Buff)=1 then //Если это ссылк (href) begin Buff:=trim(copy(Buff,5,length(Buff)-4)); if pos('=',Buff)=1 then //Если дальше идет "=" begin Buff:=trim(copy(Buff,2,length(Buff)-1)); case Buff[1] of #$22:begin //Если ссылка заключена в двойные кавычки Buff:=trim(copy(Buff,2,length(Buff)-1)); Link:=trim(copy(Buff,1,pos(#$22,Buff)-1)); end; #$27:begin //Если ссылка заключена в одинарные кавычки Buff:=trim(copy(Buff,2,length(Buff)-1)); Link:=trim(copy(Buff,1,pos(#$27,Buff)-1)); end; else begin //Иначе если без кавычек j:=1; while not (Buff[j] in [#$20,#$09,#$0D,#$0A]) do inc(j); Link:=trim(copy(Buff,1,j-1)); //Получили ссылку end; end; if TestLink(Link) then //Если ссылка корректная и нашего сайта begin Flag:=False; //Проверка - есть она уже в списке или нет for j:=0 to memResult.Lines.Count-1 do Flag:=Flag or (Link=memResult.Lines[j]); if not Flag then //Если нет - добавляем memResult.Lines.Add(Link); end; end; end; end; i:=pos('<',Buff); //Продолжаем просматривать тэги end; end; //Нажатие на кнопку "Анализ" procedure TfrmMain.btnAnalysisClick(Sender: TObject); var i:integer; begin btnAnalysis.Enabled:=False; //Дезактивация кнопки PageNumber:=0; //Нет еще страниц CommonSize:=0; //Начальная инициализация MinSize:=$7FFFFFFF; //глобальных переменных MaxSize:=0; MaxLink:=''; MinLink:=''; Host:=AnsiLowerCase(trim(edHost.Text));//Получаем адрес сервера NMHTTP.Port:=StrToInt(edPort.Text); //Получаем номер порта NMHTTP.Host:=Host; if Host[length(Host)]='/' then Host:=trim(copy(Host,1,length(Host)-1)); if copy(Host,1,7)<>'http://' then Host:='http://'+Host; Current:=Host+'/index.html'; //Текущая страница - главная NMHTTP.Get(trim(edHost.Text)); //Запрашиваем тело страницы i:=1; while i<memResult.Lines.Count do //Пока в списке есть ссылки begin Current:=memResult.Lines[i]; //Последовательно запрашиваем NMHTTP.Get(memResult.Lines[i]);//страницы сайта inc(i); end; btnAnalysis.Enabled:=True; //Активизация кнопки lbMax.Caption:=MaxLink; //Вывод результатов lbMin.Caption:=MinLink; lbSize.Caption:=IntToStr(CommonSize); lbNumber.Caption:=IntToStr(PageNumber); lbMaxSize.Caption:=IntToStr(MaxSize); lbMinSize.Caption:=IntToStr(MinSize); end; //Процедура вызывается, если запрос успешен и сервер передал страницу procedure TfrmMain.NMHTTPSuccess(Cmd: CmdType); var S:string; N:integer; //Размер текущей страницы begin S:=AnsiLowerCase(NMHTTP.Body); //Получаем тело страницы inc(PageNumber); //Счетчик страниц N:=length(S); //Размер страницы if N>MaxSize then //Если размер больше максимальной страницы, begin MaxSize:=N; //текущая максимальная MaxLink:=Current; end; if N<MinSize then //Если размер меньше минимальной, begin MinSize:=N; //то текущая страница минимальная MinLink:=Current; end; CommonSize:=CommonSize+N; //Суммарный размер страниц GetLinks(S); //Разобрать тело страницы на ссылки end; //Нажатие на кнопку "Выход" procedure TfrmMain.btnQuitClick(Sender: TObject); begin Close; end; end. |