Неужели Дельфям слабо...!?
Задача 1.Есть папка размером 161 Mb, файлов 12 541, папок 413
2. Нужно определить ее размер наиболее быстрым образом
Решение
I. В Delphi
Использовал пример из "Советы по Delphi от Валентина Озерова 1.4.2001"
Вот этот пример
*****************************************************************************
DirBytes Cardinal; //переменная для определения размера директории
procedure TForm1.Size_subfolder(Dirstring);
var
SearchRec TSearchRec;
Separator string;
begin
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
DirBytes = DirBytes + SearchRec.Size;
end else if DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
begin
Size_subfolder(Dir+Separator+SearchRec.Name);
end;
end;
while FindNext(SearchRec) = 0 do
begin
if FileExists(Dir+Separator+SearchRec.Name) then
begin
DirBytes = DirBytes + SearchRec.Size;
end
else if DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
begin
Size_subfolder(Dir+Separator+SearchRec.Name);
end;
end;
end;
end;
FindClose(SearchRec);
end;
*****************************************************************************
Delphi определяли размер папки за 120 секунд!!!
II.В Visual Basic 6.0 Pro динамически подключался к "Microsoft Scripting Runtime" - SCRRUN.DLL
Вот этот код
*****************************************************************************
Sub ShowFolderSize(path As String)
Dim fs, My_Folder
Set fs = CreateObject("Scripting.FileSystemObject")
Set My_Folder = fs.GetFolder(path)
MsgBox My_Folder.Size 'Выводится сообщение о размере папки
End Sub
*****************************************************************************
Visual Basic определяли размер папки за 3 секунды!!!
Есть разница между 3 секундами и 120 секундами?
Я не знаю, как воспользоваться SCRRUN.DLL в Delphi 5.0
В книгах описана возможность вызова лишь функций из DLL - файлов.
Может, есть какая-то API-функция определения размера папки (каталога), которую можно вызвать из Delphi 5.0?
С уважением Тарас [EMAIL]tarnet@pisem.net[/EMAIL]
Size: cardinal = 0;
type
TMainF = class(TForm)
....
public
{ Public declarations }
procedure Scan (s: string);
end;
var
MainF: TMainF;
implementation
{$R *.DFM}
procedure TMainF.ToolButton1Click(Sender: TObject);
begin
if dl.Directory <> '' then begin
Size := 0;
Scan (dl.Directory);
Label1.Caption := FormatFloat ('###,###,###,###,##0', Size);
end;
end;
procedure TMainF.Scan(s: string);
var
sr: TSearchRec;
r: integer;
OldDir: string;
begin
try
ChDir (s);
r := FindFirst ('*.*', faAnyFile, sr);
while r = 0 do begin
if (sr.Name <> '.') and (sr.Name <> '..') then begin
if (faDirectory and sr.Attr) = faDirectory then begin
OldDir := GetCurrentDir;
Scan (ExpandFileName (sr.Name));
ChDir (OldDir);
end else begin
Inc (Size, sr.Size);
end;
end;
r := FindNext (sr);
end;
finally
FindClose (sr);
end;
end;
end.
Program Files (1 104 011 684 байт) у меня сканировался за 4-5 секунд. 160 метров - не знаю, засечь не успевал. Машина - Athlon 950, 128 ОЗУ, винт - Quantum FireBall 30 Gb.
А вот что касается "слабо", кривые ручки - они и в Никарагуа кривые ручки.