Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.06.2009, 12:10
Comp-1984 Comp-1984 вне форума
Прохожий
 
Регистрация: 06.10.2007
Сообщения: 22
Репутация: 10
Вопрос вывести количество и суммарный размер всех файлов сервера

(Delphi 7) Необходимо реализовать следующее задание: Определить и вывести количество и суммарный размер всех файлов сервера, не являющихся HTML-документами и рисунками. Вывести их список.

Фишка состоит в том что программа должна все это выполнять через HTTP протокол. Помогите пожалуйста я в этом просто новичок. Бьюсь уже три дня и все бес толку. Заранее благодарен!!!

Последний раз редактировалось Comp-1984, 16.06.2009 в 12:13.
Ответить с цитированием
  #2  
Старый 16.06.2009, 15:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Не сомсем понятно, что надо сделать. Дело в том, что если на сервере кроме Web-сервера ничего нет (ну, в смысле другого доступа нет), то ты сможешь получить только файлы, на которые есть ссылки с тех самых html-страниц. Это делается достаточно легко.
А вот если тебе надо реальное положение дел, то придется на сервер ставить демона, который умеет отдавать эту информацию по какому-либо порту и просто обращаться к нему, а уж сам демон (сервис) будет эту информацию получать средстами чтения файловой системы.

Так что определись что тебе реально нужно...
Ответить с цитированием
  #3  
Старый 17.06.2009, 10:45
Comp-1984 Comp-1984 вне форума
Прохожий
 
Регистрация: 06.10.2007
Сообщения: 22
Репутация: 10
Вопрос Через гипер ссылки

Получается через HTTP протокол я не как не смогу узнать суммарный размер всех файлов сервера, не являющихся HTML-документами и рисунками? Если не трудно размести пример со ссылками! Спасибо!
Ответить с цитированием
  #4  
Старый 17.06.2009, 10:55
Comp-1984 Comp-1984 вне форума
Прохожий
 
Регистрация: 06.10.2007
Сообщения: 22
Репутация: 10
Восклицание Вот есть пример другой задачи!!!

Определить и вывести суммарный размер всех страниц 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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter