Форум: "Начинающим";
Текущий архив: 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