[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 |