program dirmoz; { lists all files in the current directory and subdirectories, with their size } {$APPTYPE CONSOLE} uses SysUtils; procedure PrintHelp; begin writeln('DirMoz: list files recursively printing size and full path'); writeln('Options: max file size, min file size'); end; procedure ListDir(aDir: string); var lSearchRec: TSearchRec; begin if FindFirst(aDir + '*', faAnyFile, lSearchRec) = 0 then begin repeat if (lSearchRec.Attr and faDirectory) <> 0 then begin if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then ListDir(IncludeTrailingPathDelimiter(aDir + lSearchRec.Name)); end else writeln(Format('%12d %s', [lSearchRec.Size, aDir + lSearchRec.Name])); until FindNext(lSearchRec) <> 0; FindClose(lSearchRec); end; end; procedure ListDirMax(aDir: string; aMaxSize: cardinal); var lSearchRec: TSearchRec; begin if FindFirst(aDir + '*', faAnyFile, lSearchRec) = 0 then begin repeat if (lSearchRec.Attr and faDirectory) <> 0 then begin if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then ListDirMax(IncludeTrailingPathDelimiter(aDir + lSearchRec.Name), aMaxSize); end else if cardinal(lSearchRec.Size) <= aMaxSize then writeln(Format('%12d %s', [cardinal(lSearchRec.Size), aDir + lSearchRec.Name])); until FindNext(lSearchRec) <> 0; FindClose(lSearchRec); end; end; procedure ListDirMin(aDir: string; aMinSize: cardinal); var lSearchRec: TSearchRec; begin if FindFirst(aDir + '*', faAnyFile, lSearchRec) = 0 then begin repeat if (lSearchRec.Attr and faDirectory) <> 0 then begin if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then ListDirMin(IncludeTrailingPathDelimiter(aDir + lSearchRec.Name), aMinSize); end else if cardinal(lSearchRec.Size) >= aMinSize then writeln(Format('%12d %s', [cardinal(lSearchRec.Size), aDir + lSearchRec.Name])); until FindNext(lSearchRec) <> 0; FindClose(lSearchRec); end; end; procedure ListDirMinMax(aMaxSize: cardinal; aDir: string; aMinSize: cardinal); var lSearchRec: TSearchRec; begin if FindFirst(aDir + '*', faAnyFile, lSearchRec) = 0 then begin repeat if (lSearchRec.Attr and faDirectory) <> 0 then begin if (lSearchRec.Name <> '.') and (lSearchRec.Name <> '..') then ListDirMinMax(aMaxSize, IncludeTrailingPathDelimiter(aDir + lSearchRec.Name), aMinSize); end else if (cardinal(lSearchRec.Size) >= aMinSize) and (cardinal(lSearchRec.Size) <= aMaxSize) then writeln(Format('%12d %s', [cardinal(lSearchRec.Size), aDir + lSearchRec.Name])); until FindNext(lSearchRec) <> 0; FindClose(lSearchRec); end; end; var lMaxSize, lMinSize: cardinal; begin lMaxSize := 0; lMinSize := 0; if (ParamCount > 0) then lMaxSize := StrToInt64Def(ParamStr(1), 0); if (ParamCount > 1) then lMinSize := StrToInt64Def(ParamStr(2), 0); if lMaxSize < lMinSize then PrintHelp else if (lMaxSize > 0) and (lMinSize > 0) then ListDirMinMax(lMaxSize, IncludeTrailingPathDelimiter(GetCurrentDir), lMinSize) else if (lMaxSize > 0) then ListDirMax(IncludeTrailingPathDelimiter(GetCurrentDir), lMaxSize) else if (lMinSize > 0) then ListDirMin(IncludeTrailingPathDelimiter(GetCurrentDir), lMinSize) else ListDir(IncludeTrailingPathDelimiter(GetCurrentDir)); end.