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


Автор: Antony41 10.5.2009, 14:13
Всем привет! С прошедшим всех!
Как нужно быть в такой ситуации.

Есть заданный путь для поиска. например (C:\)
Поиск включает в себя поддиректории, и маска может быть любой. (*.mp3 или *.*)
Как создать прогрэс бар?
Сначало произвести поиск всех файлов и потом, те файлы которые не входят в маску исключить и получившее значение будет Max для прогрэса как?

Автор: Fhusy 10.5.2009, 14:37
а зачем тебе прогресс бар? и что он будет отображать?

Автор: Antony41 10.5.2009, 14:40
начинаю поиск файлов с определённого места например с ('C:\*.*'), включая поддиректории
Прогрэс должен показывать сколько осталось до окончания поиска

Автор: Демо 10.5.2009, 16:11
Цитата(Antony41 @  10.5.2009,  14:40 Найти цитируемый пост)
Прогрэс должен показывать сколько осталось до окончания поиска 


А как ты определишь конкретное значение до окончания поиска?
Тебе остаётся только лишь имитировать прогрессбар, показывая пользщователю, что программа не висит, а работает.

Автор: Antony41 10.5.2009, 16:40
решил проблему

Код

var
Count:Integer=0;

implementation

function GetFileCountTwo(Dir,Mask: string): integer;
var
  fsc: TSearchRec;
  FindResult: Integer;
begin
  Result:=0;
  Dir:=IncludeTrailingBackslash(Dir);
    FindResult := FindFirst(Dir + '*.*', faAnyFile, fsc);
    try
      while FindResult = 0 do
        with fsc do
        begin
          if (Attr and faDirectory) <> 0 then
          begin
            if (Name <> '.') and (Name <> '..') then
              GetFileCountTwo(Dir + Name, Mask);
          end
          else
          begin
            if MatchesMask(Name, Mask) then
              Inc(Count);
          end;
          FindResult := FindNext(fsc);
        end;
    finally
      sysUtils.FindClose(fsc);
    end;
end;


//Cколько файлов есть в определённой папке
function GetFileCount(Dir,Mask: string): integer;
var
  fsc: TSearchRec;
  FindResult: Integer;
begin
  Count:=0;
  Dir:=IncludeTrailingBackslash(Dir);
    FindResult := FindFirst(Dir + '*.*', faAnyFile, fsc);
    try
      while FindResult = 0 do
        with fsc do
        begin
          if (Attr and faDirectory) <> 0 then
          begin
            if (Name <> '.') and (Name <> '..') then
              GetFileCountTwo(Dir + Name, Mask);
          end
          else
          begin
            if MatchesMask(Name, Mask) then
              Inc(Count);
          end;
          FindResult := FindNext(fsc);
        end;
    finally
      sysUtils.FindClose(fsc);
    end;
    Result:=Count;
end;


Код

Showmessage(IntToStr(GetFileCount('C:\', '*.mp3')));

Автор: Демо 10.5.2009, 23:37
Э-э... А где тут прогрессбар?

Автор: kami 10.5.2009, 23:44
Цитата(Antony41 @  10.5.2009,  14:13 Найти цитируемый пост)
 получившее значение будет Max для прогрэса

Точное время для этого действия оценить нельзя.
Для показа работы, не имеющей конкретной продолжительности используют "бесконечный" ProgressBar, отображающий циклическое пробегание полоски слева направо. Обычно сверху полоски пишут, какое действие/файл находится на данный момент в обработке.

В приведенном тобой коде, как я понял, работа по поиску файлов будет выполняться дважды. Первый раз - для получения max значения, а второй уже для визуального поиска. Нерационально.

Автор: AntonN 11.5.2009, 00:45
Antony41
Цитата

решил проблему

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

Автор: dumb 11.5.2009, 02:34
небольшим утешением может быть только то, что второй "проход" будет значительно быстрее за счет кэша. а в общем - конечно же, никто в таких случаях "точный" прогресс не показывает.

Автор: Демо 11.5.2009, 14:13
Цитата(dumb @  11.5.2009,  02:34 Найти цитируемый пост)
будет значительно быстрее за счет кэша


Это вряд ли-) Я имею ввиду слово "значительно"

Автор: dumb 11.5.2009, 21:32
Цитата(Демо @  11.5.2009,  14:13 Найти цитируемый пост)
Это вряд ли-) Я имею ввиду слово "значительно" 
полагаю, что порядок - это значительно. smile сейчас сделал поиск по диску C: файла *text*. первый проход - 32 секунды. второй - 3 секунды.
иногда приходится искать "иголку" по всем дискам - момент кэширования заметен сразу.

Добавлено через 38 секунд
edit: момент = эффект

Автор: Демо 11.5.2009, 22:58
dumb
Согласен.
В таком случае прогрессбар при повторном поиске вообще не имеет смысла.
У меня на 200 тысячах файлов повторный проход занимает 6 секунд.

Автор: Snowy 12.5.2009, 17:02
Данная операция не подвергается прогнозу, если только файлы не проиндексированы.
Возможно в Windows 7 или далее будет доступ к файловой базе через SQL запросы.
А пока файловая система - это непрогнозируемый киш-миш.
Так что бери пример с микрософта и показывай анимированную собачку, вынюхивающую файлы.

Автор: Antony41 12.5.2009, 21:27
Как же не используется ни где, могу привести, как пример, программы: Clone Remover, Alike File Finder, и др.
Первый поиск передаёт результат в StringList, что выполняет его за 2-3 сек. А у второго совсем другая система. и результат он возвращает в listView. 
Но я с вами согласен лучше использовать полоску. Что то не догадался сразу

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