Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.13;
Скачать: CL | DM;

Вниз

ПРо поиск фаилов (Теоритеческий)   Найти похожие ветки 

 
rlzz   (2006-07-24 14:19) [0]

Каким способом организован поиск фаилов в TotalCMD?

FindFirst FindNExt и винда тормоза великие и сильно нагружают систему
У кого есть какие соображения и примеры?


 
Сергей М. ©   (2006-07-24 15:05) [1]

FindFirst FindNExt ничем не хуже любых иных документированных способов перебора/поиска.


 
Джо ©   (2006-07-24 16:37) [2]

Не думаю, что в TotalCommander"е используется нечто отличное от FindXXX в отдельном потоке.


 
Ketmar ©   (2006-07-24 21:10) [3]

>rlzz   (24.07.06 14:19)

> FindFirst FindNExt и винда тормоза великие и сильно нагружают
> систему

код, который это демонстрирует? или очередной "ля-ля, тополя, #%#% кустарник"?


 
KilkennyCat ©   (2006-07-24 21:12) [4]

> #%#%

Ух, а это что за смайл?


 
Ketmar ©   (2006-07-24 21:33) [5]

>KilkennyCat ©   (24.07.06 21:12) [4]
это матюги после встречи с тополем. %-)


 
rlzz   (2006-07-24 21:41) [6]

это ля ля


 
Мефисто   (2006-07-24 22:02) [7]


> rlzz   (24.07.06 14:19) 


Действительно, сие "жуткие" тормоза вызваны тем, что:
FindFirst и FindNExt вляются обертками для FindFirstFile и FindNextFile

P.S. Подозрительно популярная тема за эту неделю... ?


 
KilkennyCat ©   (2006-07-24 22:08) [8]

> [7] Мефисто   (24.07.06 22:02)

поэтому надо вызывать напрямую. Триллиардный вызов покажет ощутимую экономию. Гарантирую.


 
Ketmar ©   (2006-07-24 22:25) [9]

>rlzz   (24.07.06 21:41) [6]
ну так и указывайте, плз, в посте явно, что "ля-ля". во избежание.


 
Мефисто   (2006-07-24 22:25) [10]


> KilkennyCat ©   (24.07.06 22:08) [8]



> сие  "жуткие" тормоза


Ну, забыл смайлик поставить :)


 
KilkennyCat ©   (2006-07-24 22:54) [11]

> [10] Мефисто   (24.07.06 22:25)

кхе... ваще-то, я догадлся... :)


 
rlzz   (2006-07-25 16:18) [12]

function Get_File_Size2(sFileToExamine: string; bInKBytes: Boolean): string;
var
  SearchRec: TSearchRec;
  sgPath: string;
  inRetval, I1: Integer;
begin
  sgPath := ExpandFileName(sFileToExamine);
  try
    inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec);
    if inRetval = 0 then
      I1 := SearchRec.Size
    else
      I1 := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
  Result := IntToStr(I1);
end;

Procedure FindRecursive( Const path: String; Const mask: String);
//********************
 Var  fullpath: String;
//*********************

 Function Recurse( Var path: String; Const mask: String ): Boolean;
   Var
     Search: TSearchRec;
     SearchFirst: Integer;
     oldlen: Integer;
   Begin
     Recurse := True;
     oldlen := Length( path );
     SearchFirst := FindFirst( path+mask, faAnyFile, Search );
     While SearchFirst = 0 Do Begin
       Application.ProcessMessages;
       If (Search.Attr and (faDirectory or faVolumeID)) = 0 Then
       form1.ListBox1.items.Add(path+Search.name + "   SIZE: " +Get_File_Size2(path+Search.name,true));
       {Adding Path to ListBox}
       {-------------------------------------}
       //form3.StatusBar1.Panels[2].Text:=Path+Search.Name;
     
       SearchFirst := FindNext( Search );
           End;
     FindClose( Search );
     If not Result Then Exit;
   SearchFirst := FindFirst( path+"*.*", faDirectory, Search );
           While SearchFirst = 0 Do Begin
       If (Search.Attr and faDirectory) <> 0 Then
         If (Search.Name <> ".") and (Search.Name <> "..") Then Begin
                     path := path + Search.Name + "\";
           If not Recurse( path, mask ) Then Begin
             Result := False;
             Break;
           End;
           Delete( path, oldlen+1, 255 );
         End;
       SearchFirst := FindNext( Search );
     End;
     FindClose( Search );
   End; { Recurse }
Begin
   If path = "" Then
     GetDir(0, fullpath)
   Else
     fullpath := path;
   If fullpath[Length(fullpath)] <> "\" Then begin
     fullpath := fullpath + "\";
       end;
   If mask = "" Then  begin
     Recurse( fullpath, "*.*" );
         end
   Else
     Recurse( fullpath, mask );
 End;

procedure TForm1.Button1Click(Sender: TObject);
begin
findrecursive("e:\","*.doc");
end;

ОНО РАБОТАЕТ!


 
KilkennyCat ©   (2006-07-25 17:04) [13]

Это надо отметить! :)


 
programania ©   (2006-07-25 19:51) [14]

>Джо ©   (24.07.06 16:37) [2]
>Не думаю, что в TotalCommander"е используется нечто отличное от FindXXX в отдельном потоке.

у меня FindNext когда файлов в папке >10000
находит примерно 180 и далее возвращает код 6
а TotalCommander показывает все
значит должен быть еще способ


 
Dmitrij_K   (2006-07-25 20:58) [15]


> у меня FindNext когда файлов в папке >10000 находит примерно
> 180 и далее возвращает код 6а TotalCommander показывает
> всезначит должен быть еще способ

Значит код неправильный


 
Loginov Dmitry ©   (2006-07-25 22:21) [16]

> ОНО РАБОТАЕТ!


Вы бы еще Sleep(1000) в цикле поставил. Тогда бы все летало.


 
Palladin ©   (2006-07-26 01:35) [17]


> rlzz   (25.07.06 16:18) [12]

Ну работает, хорошо. Дальше то что?


 
Джо ©   (2006-07-26 02:52) [18]

> [14] programania ©   (25.07.06 19:51)

Наверное, было бы интересно посмотреть тогда на Ваш код :)


 
Мефисто   (2006-07-26 16:32) [19]


> programania ©   (25.07.06 19:51) [14]


Все дело в установленных атрибутах файла для поиска. Укажи атрибутов поболее для поиска и тебе откликнется :)


 
Плохиш ©   (2006-07-26 16:58) [20]


> rlzz   (25.07.06 16:18) [12]

Рекомендую
1. Выкинуть ProcessMessages нафик.
2. Выкинуть функцию Get_File_Size2 ещё дальше чем нафик.


 
programania ©   (2006-07-26 18:47) [21]

>Джо ©   (26.07.06 02:52) [18]
>Наверное, было бы интересно посмотреть тогда на Ваш код :)

В коде ничего интересного и пробовал его по всякому
и наверняка у Вас он будет работать и у меня работает нормально
для всех папок кроме одной причем в эту папку не может записать
новый файл ни одна программа когда их там ~10500 и имена длинные до 160 знаков
с короткими именами удается записать больше файлов
наверно это ограничение windowsXP или Fat32
приходится разделять по нескольким папкам тогда все работает


 
Ketmar ©   (2006-07-26 19:07) [22]

>programania ©   (26.07.06 18:47) [21]
FAT32??? ясно. с этим -- в детский сад. где FAT самое место.


 
Пусик ©   (2006-07-26 19:13) [23]

Если автору нужно вычислить размер каталога, то такой сложный код не нужен.

procedure GetDirSize(const aPath: String;var SizeDir: Int64);
var
 SR: TSearchRec;
 tPath: String;
begin
{$WARN SYMBOL_PLATFORM OFF}
 tPath := IncludeTrailingBackSlash(aPath);
 if FindFirst(tPath+"*.*",faAnyFile,SR)=0 then
 begin
   try
     repeat
       if (SR.Name=".") or (SR.Name="..") then Continue;
       if (SR.Attr and faDirectory)<>0 then
       begin
         GetDirSize(tPath+SR.Name,SizeDir);
         Continue;
       end;
       SizeDir := SizeDir +
                 (SR.FindData.nFileSizeHigh shl 32)+
                 SR.FindData.nFileSizeLow;
     until FindNext(SR)<>0;
   finally
     Sysutils.FindClose(SR);
   end;
 end;
{$WARN SYMBOL_PLATFORM ON}
end;



Страницы: 1 вся ветка

Текущий архив: 2006.08.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.045 c
2-1153839351
oleggar
2006-07-25 18:55
2006.08.13
BDE


2-1153900388
Wolferio
2006-07-26 11:53
2006.08.13
Доступен ли указаный копмьютер в сети


2-1153984203
Crazy monkey
2006-07-27 11:10
2006.08.13
Вопрос по Access


2-1153711774
fantasy
2006-07-24 07:29
2006.08.13
Edit


3-1149855807
Vitus
2006-06-09 16:23
2006.08.13
работа с Ole объектами