Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите как оптимизировать алгоритм 
:(
    Опции темы
Good Man
  Дата 11.12.2002, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 13.6.2002

Репутация: нет
Всего: нет



Как наиболее быстрым способом узнать, сколько файлов с определенным расширением есть в определенной папке?

Реализация на Delphi:

Код

var CountAllFiles: integer; // переменная показывает сколько файлов найдено

procedure TForm1.GetCountFile(Dir: string);
var
 SearchRec : TSearchRec;
 Separator : string;

begin
 CountAllFiles := 0;

 if Copy(Dir,Length(Dir),1)='\' then Separator := ''
 else Separator := '\';

 if FindFirst(Dir+Separator+'*.*',faAnyFile,SearchRec) = 0 then
    begin
     if FileExists(Dir+Separator+SearchRec.Name) then
        begin
          if (ExtractFileExt(SearchRec.Name) = '.html') or (ExtractFileExt(SearchRec.Name) = '.htm') then
             CountAllFiles := CountAllFiles + 1;
        end
     else if DirectoryExists(Dir+Separator+SearchRec.Name) then
             begin
               if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
                  SearchText(Dir+Separator+SearchRec.Name);
             end;

             while FindNext(SearchRec) = 0 do
               begin
                 if FileExists(Dir+Separator+SearchRec.Name) then
                    begin
                      if (ExtractFileExt(SearchRec.Name) = '.html') or (ExtractFileExt(SearchRec.Name) = '.htm') then
                         begin
                           CountAllFiles := CountAllFiles + 1;
                          end;

                    end
                 else if DirectoryExists(Dir+Separator+SearchRec.Name) then
                         begin
                           if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
                               SearchText(Dir+Separator+SearchRec.Name);
                         end;
               end;
    end;
 FindClose(SearchRec);
end;


Реализация на Visual Basic:

Код

Private Sub Command1_Click()
 Dim fso, f, fc, f1
 Dim i As Integer
 
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFolder("E:\1\nedvig_dp_ua\")
 Set fc = f.Files
 
 For Each f1 In fc
   If Right(f1.Path, 3) = "htm" Or Right(f1.Path, 4) = "html" Then
      i = i + 1
Label1.Caption = Str(i)  ‘показывает сколько файлов нашла…
      DoEvents
   End If
 Next
 
 Set fc = Nothing
 Set f = Nothing
 Set fso = Nothing

End Sub


И то и другое работает крайне медленно. Как это можно сделать быстрее?
PM MAIL   Вверх
Vit
Дата 11.12.2002, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Код

Function GetFileCount(Dir:string):integer;
var fs:TSearchRec;
begin
 Result:=0;
 if FindFirst(Dir+'\*.htm?',faAnyFile-faDirectory-faVolumeID, fs)=0 then
   repeat
     inc(Result);
   until FindNext(fs)<>0;
 FindClose(fs);
end;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Good Man
  Дата 11.12.2002, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 13.6.2002

Репутация: нет
Всего: нет



Большое спасибо Vit.
PM MAIL   Вверх
Good Man
Дата 12.12.2002, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 13.6.2002

Репутация: нет
Всего: нет



Все было хорошо и прекрасно до тех пор, пока я использовал эту функцию
в Windows NT 4.0 Servise Pack 6. Она находила и htm и html.

Но когда программу запустили в Windows 98. Эта функция подсчитывала только html файлы. htm файлы она не видела.

Перекомпиляция проекта под Windows 98 ничего не дала.

Может, нужна какая то самая последняя версия DLL-файла. Какая именно я не знаю.

Если не сложно объясните в чем проблема?
PM MAIL   Вверх
Good Man
Дата 12.12.2002, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 13.6.2002

Репутация: нет
Всего: нет



Разобрался:

В маске поиска функции FindFirst знак "?" нужно заменить на "*"
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.