Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.04 c
15-1153374659
Ega23
2006-07-20 09:50
2006.08.13
С Днём рождения! 20 июля


2-1153487778
bajenovv
2006-07-21 17:16
2006.08.13
кнопка


2-1153511140
WhiteCat
2006-07-21 23:45
2006.08.13
Проклятый DBGrid


2-1153915713
WhiteCat
2006-07-26 16:08
2006.08.13
Не вносить запись в таблицу


1-1151833319
flaxe
2006-07-02 13:41
2006.08.13
Вставить в одну картинку другую





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский