function ListFilesOf(
CONST aFolder, FileType:
string;
CONST ReturnFullPath, DigSubdirectories: Boolean): TTSL;
{ If DigSubdirectories is false, it will return only the top level files,
else it will return also the files in subdirectories of subdirectories.
If FullPath is true the returned files will have full path.
FileType can be something like '*.*' or '*.exe;*.bin'
Will show also the Hidden/System files.
Source Marco Cantu Delphi 2010 HandBook
// Works with UNC paths}
VAR
i: Integer;
s:
string;
SubFolders, filesList: TStringDynArray;
MaskArray: TStringDynArray;
Predicate: TDirectory.TFilterPredicate;
procedure ListFiles(
CONST aFolder:
string);
VAR strFile:
string;
begin
Predicate:=
function(
const Path:
string;
const SearchRec: TSearchRec): Boolean
VAR Mask:
string;
begin
for Mask
in MaskArray
DO
if System.Masks.MatchesMask(SearchRec.
Name, Mask)
then EXIT(TRUE);
EXIT(FALSE);
end;
filesList:= TDirectory.GetFiles (aFolder, Predicate);
for strFile
in filesList
DO
if strFile<> '
'
{ Bug undeva: imi intoarce doua intrari empty ('') }
then Result.Add(strFile);
end;
begin
{ I need this in order to prevent the EPathTooLongException (reported by some users) }
if aFolder.Length >= MAXPATH
then
begin
MesajError('
Path is longer than '+ IntToStr(MAXPATH)+ '
characters!');
EXIT(
NIL);
end;
if NOT System.IOUtils.TDirectory.Exists (aFolder)
then RAISE Exception.Create('
Folder does not exist! '+ CRLF+ aFolder);
Result:= TTSL.Create;
{ Split FileType in subcomponents }
MaskArray:= System.StrUtils.SplitString(FileType, '
;');
{ Search the parent folder }
ListFiles(aFolder);
{ Search in all subfolders }
if DigSubdirectories
then
begin
SubFolders:= TDirectory.GetDirectories(aFolder, TSearchOption.soAllDirectories,
NIL);
for s
in SubFolders
DO
if cIO.DirectoryExists(s)
{ This solves the problem caused by broken 'Symbolic Link' folders }
then ListFiles(s);
end;
{ Remove full path }
if NOT ReturnFullPath
then
for i:= 0
to Result.Count-1
DO
Result[i]:= TPath.GetFileName(Result[i]);
end;
{ Works with >4GB files
Source: http://stackoverflow.com/questions/1642220/getting-size-of-a-file-in-delphi-2010-or-later }
function GetFileSize(
const aFilename:
String): Int64;
VAR
info: TWin32FileAttributeData;
begin
if GetFileAttributesEx(PWideChar(aFileName), GetFileExInfoStandard, @info)
then Result:= Int64(info.nFileSizeLow)
or Int64(info.nFileSizeHigh
shl 32)
else Result:= -1;
end;
function GetFolderSize(aFolder:
string; FileType: string= '
*.*'; DigSubdirectories: Boolean= TRUE): Int64;
VAR
i: Integer;
TSL: TTSL;
begin
Result:= 0;
TSL:= ListFilesOf(aFolder, FileType, TRUE, DigSubdirectories);
TRY
for i:= 0
to TSL.Count-1
DO
Result:= Result+ GetFileSize(TSL[i]);
FINALLY
FreeAndNil(TSL);
END;
end;