Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Массовый опрос существования файлов


Автор: Isaev 30.1.2011, 06:57
Дан сервер с парой десятков файлов, имена сформерованы рандомно по маске 'Name_00000000.rar' .. 'Name_FFFFFFFF.rar'. Требуется максимально быстро найти названия файлов!
Делаю так:
Код

Procedure TForm1.Button1Click(Sender:TObject);
Var
  N:Integer;
  G:Cardinal;
  FName,VName:String;
  hSession,hURL:HInternet;
  R:Cardinal;
  Q:Boolean;
  Buf:Byte;
Begin
  N:=0;
  G:=0;
  hSession:=InternetOpen('XXX',PRE_CONFIG_INTERNET_ACCESS,nil,nil,0);
  Repeat
      FName:='Name_'+IntToHex(G,8)+'.rar';
      VName:='http://path/files/'+FName;
      hURL:=InternetOpenURL(hSession,PChar(VName),nil,0,0,0);
      Q:=InternetReadFile(hURL,@Buf,1,R);
      // проверяю 'R' как первый символ Rar-архива 
      If Not(Q) Or (R=0) Or (Buf[1]<>Ord('R')) Then {Memo1.Lines.Append('Err:'+IntToHex(G,8))}
                                                                     Else Memo1.Lines.Append('OK:'+IntToHex(G,8));
      If Assigned(hURL) Then InternetCloseHandle(hURL);
      If N=256 Then
        Begin
          N:=0;
          Edit1.Text:=IntToHex(G,8);
          Application.ProcessMessages;
        End;
    Inc(N);
    Inc(G);
  Until G=High(Cardinal);
  Memo1.Lines.Append('Ende');
  InternetCloseHandle(hSession);
End;

Работает, но по скромным подсчётам 13 лет для полного перебора.
PS: при обращении к несуществующему файлу сервер редиректит на свою страницу с сообщением 404.

Автор: Addmin 30.1.2011, 11:36
Мне кажется, что постановка задачи неверна. Серверу - серверное. Сделайте cgi-программу, которая будет заниматься проверкой файлов на сервере и выдавать список файлов в любом удобном виде, и просто получайте этот список из своей локальной программы.

P.S. И так ли уж нужна проверка архива на первую R? Может просто искать файлы по маске "Name*.rar"?

Автор: Isaev 30.1.2011, 16:36
Цитата(Addmin @ 30.1.2011,  11:36)

Мне кажется, что постановка задачи неверна. Серверу - серверное. Сделайте cgi-программу, которая будет заниматься проверкой файлов на сервере и выдавать список файлов в любом удобном виде

В чём разница?
Цитата(Addmin @ 30.1.2011,  11:36)

и просто получайте этот список из своей локальной программы

Речь идёт не о своём сервере... Т.е. я cgi туда же всё равно залить не смогу, потому не смогу получить список, как из локальной программы! Или я не совсем понял ход Вашей мысли?
Тогда КАК?
Цитата(Addmin @ 30.1.2011,  11:36)

P.S. И так ли уж нужна проверка архива на первую R? Может просто искать файлы по маске "Name*.rar"?

Вполне, только снова КАК? У меня на считывание 1 байта и на запрос имени разница по времени не получилась.

Автор: Addmin 30.1.2011, 16:55
Цитата(Isaev @  30.1.2011,  16:36 Найти цитируемый пост)
В чём разница?

Сервер выполнит операции поиска файлов на себе намного быстрее, чем программа, которая обращается к файлам на сервере с локального компьютера. 

Цитата(Isaev @  30.1.2011,  16:36 Найти цитируемый пост)
Речь идёт не о своём сервере... Т.е. я cgi туда же всё равно залить не смогу, потому не смогу получить список, как из локальной программы! Или я не совсем понял ход Вашей мысли?
Тогда КАК?

Ну, знаете PHP? Хотя бы немного? На любом сервере он должен быть установлен. Если, конечно, это не ftp-хранилище. 

Допустим, скрипт на PHP читает весь список файлов, расположенных на сервере по указанному пути и с нужной маской имени , в массив, а затем выдаёт список файлов в виде текста...

Подождите, вы хотите сказать, что вы вообще не имеете доступа к серверу? То есть, он чужой? Да, тогда дело плохо.



Автор: Isaev 30.1.2011, 16:58
Цитата(Addmin @  30.1.2011,  16:55 Найти цитируемый пост)
То есть, он чужой?

именно... стал бы я так извращаться на своём  smile 

Автор: Isaev 31.1.2011, 20:51
Больше идей ни у кого нету?

Автор: Snowy 1.2.2011, 01:54
Совет банальный как банан - в 100 тредов задача займет в 100 + (X/K) раз меньше времени
Где X - количество файлов, К - количество вариантов.
Основное время занимает ответ от сервера.
Так что 1 запрос и 100 одновременных запросов  будут выполняться примерно одинаковое время.
Единственная проблема - могут забанить.
Впрочем, в случае одного треда это не менее реально.
Также не обязательно тянуть сразу файл.
Можно сначала запросить Head. И, если информация о файле устраивает, то тянуть уже файл, а не тягать 404-ю страницу каждый раз целиком.
Ну какой смысл тянуть всю страницу? 404? Всё, брось каку. Не нужно читать файл (InternetReadFile). Он не вкусный.

Автор: Isaev 1.2.2011, 03:31
Цитата(Snowy @  1.2.2011,  01:54 Найти цитируемый пост)
Совет банальный как банан - в 100 тредов задача займет в 100 + (X/K) раз меньше времени

Ну это ясно, остаётся только потестить какую нагрузку выдержит сервер...

Цитата(Snowy @  1.2.2011,  01:54 Найти цитируемый пост)
Можно сначала запросить Head

Вот про HEAD не знал, спасибо... Буду на досуге мучить дальше smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)