[Notes2-team] =?iso-8859-1?Q?RES:_=5BNotes2-team=5D_Alpha_-_faltam_umas_partes!_Vamos?= =?iso-8859-
Brought to you by:
andersonrb
|
From: Jonas R. S. S. <jon...@bo...> - 2004-04-22 08:05:02
|
Como vc some no mundo, eu toh mandano por aki memo hueahuhahueahuhe :b
Depois eu fa=E7o o tal to tar+zlib, agora eu toh com sono :]
mtos par=E2metros sendo passados recursivamente n=E3o =E9 mto bom hehe,
consome mais mem=F3ria e tempo por causa da pilha q eh amontoada a cada
chamada... Isso =E9 f=E1cil de se provar hehe na medida em q esse stack
improvisado feito em pascal ficou mais r=E1pido do q o m=E9todo =
recursivo
onde as vari=E1veis s=E3o manuseadas usano asm e c, ou sei lah no q q os
kras fizeram essa parte de pilha, sem contar q eu tirei uns brugs besta
:]
procedure BuildFolderTree( var TheFolderTree: PNotesFolderTree; Folder:
string; const Options: TNotesBuildFolderTreeOptions =3D ftAll; const
ScanSubFolders: Boolean =3D false; const FolderMask: string =3D '*'; =
const
FileMask: string =3D '*' );
type
PFolderStackItem =3D ^TFolderStackItem;
TFolderStackItem =3D record
FolderTree: PNotesFolderTree;
Folder: string;
end;
TFolderStack =3D array of PFolderStackItem;
var
FolderStack: TFolderStack;
SearchRec: TSearchRec;
CurStack: PFolderStackItem;
SameMask: Boolean;
procedure PushStack( var FT: PNotesFolderTree; const AFolder: string
);
var
FSI: PFolderStackItem;
begin
FSI :=3D AllocMem( SizeOf( TFolderStackItem ) );
if not Assigned( FT ) then
FT :=3D AllocMem( SizeOf( TNotesFolderTree ) );
with FSI^ do begin
FolderTree :=3D FT;
Folder :=3D AFolder;
end;
SetLength( FolderStack, Length( FolderStack ) + 1 );
FolderStack[ High( FolderStack ) ] :=3D FSI;
end;
procedure PopStack;
begin
CurStack :=3D FolderStack[ High( FolderStack ) ];
SetLength( FolderStack, High( FolderStack ) );
end;
begin
TheFolderTree :=3D nil;
SameMask :=3D FolderMask =3D FileMask;
Folder :=3D AddSlash( Folder );
PushStack( TheFolderTree, Folder );
while Length( FolderStack ) > 0 do begin
PopStack;
if ( Options in [ftAll,ftOnlyFolders] ) and ( FindFirst(
CurStack^.Folder + FolderMask, faAnyFile, SearchRec ) =3D 0 ) then
repeat
if ( SearchRec.Attr and faDirectory <> 0 ) then begin
if( SearchRec.Name[1] <> '.' ) then begin
SetLength( CurStack^.FolderTree^, Length(
CurStack^.FolderTree^ ) + 1 );
with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ]
do begin
Path :=3D SearchRec.Name;
IsFolder :=3D True;
if ScanSubFolders then
PushStack( Items, AddSlash( CurStack^.Folder + Path ) );
end;
end;
end
else if SameMask then begin
SetLength( CurStack^.FolderTree^, Length(
CurStack^.FolderTree^ ) + 1 );
with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ] do
begin
Path :=3D SearchRec.Name;
IsFolder :=3D False;
end;
end;
until FindNext( SearchRec ) <> 0;
SysUtils.FindClose( SearchRec );
if ( Options in [ftOnlyFiles] ) and ( FindFirst( CurStack^.Folder +
FileMask, faAnyFile, SearchRec ) =3D 0 ) then
repeat
if ( SearchRec.Attr and faDirectory <> 0 ) and (
SearchRec.Name[1] <> '.' ) and ScanSubFolders then
PushStack( CurStack^.FolderTree, AddSlash( CurStack^.Folder +
SearchRec.Name ) )
else if SearchRec.Attr and faDirectory =3D 0 then begin
SetLength( CurStack^.FolderTree^, Length(
CurStack^.FolderTree^ ) + 1 );
with CurStack^.FolderTree^[ High( CurStack^.FolderTree^ ) ] do
begin
Path :=3D SearchRec.Name;
IsFolder :=3D False;
end;
end;
until FindNext( SearchRec ) <> 0;
SysUtils.FindClose( SearchRec );
CurStack^.Folder :=3D '';
FreeMem( CurStack );
end;
end;
caso fosse adicionado um diret=F3rio sem nenhum arquivo/subdiret=F3rio, =
isso
aki ia pipocar na segunda primeira recursiva hueaheaiuheauea
procedure FreeFolderTree( FolderTree: PNotesFolderTree );
var
I: Integer;
Begin
if Assigned( FolderTree ) then begin
for I :=3D 0 to High( FolderTree^ ) do
if FolderTree^[I].IsFolder then
FreeFolderTree( FolderTree^[I].Items );
FreeMem( FolderTree );
end;
end;
Jonas Raoni Soares Silva
-------------------------------
#Equipe do Notes
Coordenador de desenvolvimento
|