Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ **** UBPFD *********** by delphibase.endimus.com **** >> Итератор для поиска файлов в директории (first/next/eof) Очень часто задают вопрос "как перебрать все файлы папки". Так же часто предлагают использовать FindFirst/FindNext. Я написал класс TEnumFolder который предоставляет более удобный интерфейс поиска за счет использованием методов First/Next/Eof. Используйте свойства AbsPath и RelPath для получения абсолютного и относетильного пути текущего файла/папки. Свойство SR типа PSearchRec, содержит информацию о текущем файле/папке. Так же можно указать режим перебора (IsFolderFirst = False) при котором, можно удалить всю папку(!), т.е. в начале находятся все файлы папки, а потом сама папка (т.к. можно удалять только пустую папку). Зависимости: Classes, SysUtils Автор: Kingdom, dnsk@mail.ru, Санкт-Петербург Copyright: Kingdom Дата: 30 сентября 2003 г. ***************************************************** } unitEnmFolder; interface
uses
Classes, SysUtils; type
PSearchRec = ^TSearchRec; TEnumFolder = class
private
FBasePath: string
; FList: TStrings; FSR: PSearchRec; FIsFolderFirst: Boolean; FBasePos: Integer; FNextProc: procedure
of
object
; function
GetAbsPath: string
; function
GetRelPath: string
; procedure
ClearList; function
GetPathType(Path: string
): Integer; procedure
PushSR(Dir: string
); procedure
PopSR; procedure
Next1; procedure
Next2; public
constructor
Create(BasePath: string
; IsFolderFirst: Boolean = True); destructor
Destroy; override
; procedure
First; procedure
Next; function
Eof: Boolean; property
AbsPath: string
read
GetAbsPath; property
RelPath: string
read
GetRelPath; property
SR: PSearchRec read
FSR; end
; implementation
{ TEnumFolder } constructor
TEnumFolder.Create(BasePath: string
; IsFolderFirst: Boolean); begin
inherited
Create; FList := TStringList.Create; FBasePath := ExcludeTrailingBackslash(BasePath); FIsFolderFirst := IsFolderFirst; if
IsFolderFirst then
FNextProc := Next1 else
FNextProc := Next2; end
; destructor
TEnumFolder.Destroy; begin
ClearList; FList.Free; inherited
; end
; procedure
TEnumFolder.ClearList; begin
while
(FList.Count > 0) do
PopSR; end
; function
TEnumFolder.GetAbsPath: string
; begin
Result := FList[0] + SR.Name; end
; function
TEnumFolder.GetRelPath: string
; begin
Result := Copy(AbsPath, FBasePos, MaxInt); end
; function
TEnumFolder.GetPathType(Path: string
): Integer; begin
New(FSR); if
(FindFirst(Path, faAnyFile, SR^) <> 0) then
Result := -1 { Not found } else
begin
if
(SR.Attr and
faDirectory <> 0) then
begin
FBasePos := Length(Path) + 2; Path := ExtractFilePath(Path); FList.InsertObject(0, Path, TObject(SR)); Result := 1; { Folder } end
else
begin
Path := ExtractFilePath(Path); FBasePos := Length(Path) + 1; FList.InsertObject(0, Path, TObject(SR)); Result := 0; { File } end
; end
; end
; function
TEnumFolder.Eof: Boolean; begin
Result := (FList.Count = 0); end
; procedure
TEnumFolder.First; begin
FSR := nil
; ClearList; case
GetPathType(FBasePath) of
{ Folder } 1: if
not
FIsFolderFirst then
begin
PushSR(FBasePath); Next; end
; { File } 0: ; end
; end
; procedure
TEnumFolder.Next; begin
FNextProc; end
; procedure
TEnumFolder.Next1; begin
{ Push folder } if
(SR.Attr and
faDirectory <> 0) then
PushSR(FList[0] + FSR.Name); while
(FList.Count > 0) and
(FindNext(SR^) <> 0) do
PopSR; end
; procedure
TEnumFolder.Next2; begin
while
(FList.Count > 0) do
if
(FindNext(SR^) <> 0) then
begin
PopSR; Break; end
else
if
(SR.Attr and
faDirectory <> 0) then
PushSR(FList[0] + FSR.Name) else
Break; end
; procedure
TEnumFolder.PushSR(Dir: string
); begin
New(FSR); FindFirst(Dir + '*.*', faAnyFile, FSR^); FindNext(FSR^); { Skip "." and ".." } FList.InsertObject(0, Dir + '', TObject(FSR)); end
; procedure
TEnumFolder.PopSR; begin
FList.Delete(0); FindClose(SR^); Dispose(SR); if
FList.Count > 0 then
FSR := PSearchRec(FList.Objects[0]) else
FSR := nil
; end
; end
.
Пример использования:
procedureTForm1.Button1Click(Sender: TObject); var
fe: TEnumFolder; begin
{ Показываем содержимое папки } Memo1.Lines.BeginUpdate; Memo1.Clear; fe := TEnumFolder.Create('c: emp', True); fe.First; while
not
fe.Eof do
begin
Memo1.Lines.Add(fe.AbsPath); fe.Next; end
; fe.Free; Memo1.Lines.EndUpdate; end
; procedure
TForm1.Button2Click(Sender: TObject); var
fe: TEnumFolder; begin
{ Удаляем папку } fe := TEnumFolder.Create('c: emp', False); fe.First; while
not
fe.Eof do
begin
if
(fe.SR.Attr and
faDirectory) = 0 then
DeleteFile(fe.AbsPath) else
RemoveDir(fe.AbsPath); fe.Next; end
; fe.Free; end
;