У нас был код для перебора файлов:
И используется так:
Ну это из разряда "tips'n'tricks"....
P.S. Аналогично можно "переписать" и вот это:
type
TFileProcessingFunc = function (const aFileName: string;
aData: Pointer): Boolean;
function ConcatDirName(aDirName : TFileName; aFileName : TFileName) : TFileName;
begin
if Length(aDirName) = 0 then
Result := aFileName
else
begin
Result := aDirName;
If (Length(aFileName) = 0) then Exit;
If Result[Length(Result)] <> '\' then Result := Result + '\';
If (aFileName[1] = '\') then Delete(aFileName,1,1);
Result := Result + aFileName;
end;
end;
procedure ProcessFilesWithMask(const aDir, aFileNameMask: TFileName;
aFileProcessingFunc: TFileProcessingFunc;
aData: Pointer = nil);
var
l_SearchRec: TSearchRec;
l_FindResult: Integer;
begin
l_FindResult := FindFirst(ConcatDirName(aDir, aFileNameMask),
faAnyFile,
l_SearchRec);
try
while l_FindResult = 0 do
begin
if (l_SearchRec.Attr and (faDirectory or faVolumeID or faSymLink)) = 0 then
if not aFileProcessingFunc(ConcatDirName(aDir, l_SearchRec.Name), aData) then
Break;
l_FindResult:=FindNext(l_SearchRec);
end;
finally
FindClose(l_SearchRec);
end;
end;
Он переписывается с помощью анонимных функций так:
type
TFileProcessingFunc = reference to function (const aFileName: string): Boolean;
function ConcatDirName(aDirName : TFileName; aFileName : TFileName) : TFileName;
begin
if Length(aDirName) = 0 then
Result := aFileName
else
begin
Result := aDirName;
If (Length(aFileName) = 0) then Exit;
If Result[Length(Result)] <> '\' then Result := Result + '\';
If (aFileName[1] = '\') then Delete(aFileName,1,1);
Result := Result + aFileName;
end;
end;
procedure ProcessFilesWithMask(const aDir, aFileNameMask: TFileName;
aFileProcessingFunc: TFileProcessingFunc);
var
l_SearchRec: TSearchRec;
l_FindResult: Integer;
begin
l_FindResult := FindFirst(ConcatDirName(aDir, aFileNameMask),
faAnyFile,
l_SearchRec);
try
while l_FindResult = 0 do
begin
if (l_SearchRec.Attr and (faDirectory or faVolumeID or faSymLink)) = 0 then
if not aFileProcessingFunc(ConcatDirName(aDir, l_SearchRec.Name)) then
Break;
l_FindResult:=FindNext(l_SearchRec);
end;
finally
FindClose(l_SearchRec);
end;
end;
И используется так:
ProcessFilesWithMask('c:\temp', '*.tmp',
function (const aFileName: string): Boolean
begin
Result := true;
WriteLn(aFileName);
end
);
Ну это из разряда "tips'n'tricks"....
P.S. Аналогично можно "переписать" и вот это:
procedure ProcessDirectory(const aDir: TFileName;
aFileProcessingFunc: TFileProcessingFunc;
aData: Pointer = nil);
var
l_SearchRec: TSearchRec;
l_FindResult: Integer;
begin
l_FindResult := FindFirst(ConcatDirName(aDir, '*.*'),
faDirectory ,
l_SearchRec);
try
while l_FindResult = 0 do
begin
if ((l_SearchRec.Attr and faDirectory) <> 0) and (l_SearchRec.Name <> '.') and (l_SearchRec.Name <> '..') then
if not aFileProcessingFunc(l_SearchRec.Name, aData) then
Break;
l_FindResult:= FindNext(l_SearchRec);
end;
finally
FindClose(l_SearchRec);
end;
end;
В последнее время я очень полюбил вот такую простую конструкцию (uses System.IOUtils):
ОтветитьУдалитьfor FileName in TDirectory.GetFiles(...) do ;
Занятно. Не знал. Хотя под xCode ровно такой конструкцией пользуюсь. Спасибо.
ОтветитьУдалитьNSArray *vFiles = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: [[self class] path] error: NULL];
ОтветитьУдалитьfor (NSString *vFileName in vFiles) { ... }