 Описание функции
 Описание функции
 
GetFileList
Поиск файлов в папке включая подкаталоги.
GetFileList(StartDirectory.s, List Lfiles.file(), Pattern.s="*.*", Recursive=1)
Параметры
| StartDirectory.s | Путь к папке | 
| Lfiles.file() | Список, куда будет помещён список файлов | 
| Pattern.s | Маска/фильтр файлов в формате "*.*" или "*.txt|*.ini" | 
| Recursive | Флаг рекурсивного поиска, если =1 то поиск включая подпапки, а если =0, то поиск только в корне текущей папки. | 
Возвращаемое значение
Возвращает список файлов List().Пример

; idle
; https://www.purebasic.fr/english/viewtopic.php?t=51878
EnableExplicit
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    #Cdir = "\"
CompilerElse
    #Cdir = "/"
CompilerEndIf
Structure FileDate
    Created.i
    Modified.i
    Accessed.i
EndStructure
Structure File
    Name.s
    Attributes.i
    Date.FileDate
    Size.q
EndStructure
Procedure GetFileList(StartDirectory.s, List Lfiles.file(), Pattern.s = "*.*", Recursive = 1)
    Protected PatternCount, Depth, a, CurrentDirectoryID, Directory.s, TempDirectory.s
    Protected FileAttributes.i, FileSize.i, FileDate.FileDate, FileName.s, FullFileName.s
    Static NewList Lpattern.s()
    Static PatternSet, FileCount
    If Not PatternSet
        Pattern = RemoveString(Pattern, "*.")
        PatternCount = CountString(Pattern, "|") + 1
        ClearList(lpattern())
        For a = 1 To PatternCount
            AddElement(Lpattern())
            Lpattern() = UCase(StringField(Pattern, a, "|"))
        Next
        PatternSet = 1
    ElseIf depth = 0
        PatternSet = 0
    EndIf
    CurrentDirectoryID = ExamineDirectory(#PB_Any, StartDirectory, "*.*")
    If CurrentDirectoryID
        While NextDirectoryEntry(CurrentDirectoryID)
            If DirectoryEntryType(CurrentDirectoryID) = #PB_DirectoryEntry_File
                Directory = StartDirectory
                FileName = DirectoryEntryName(CurrentDirectoryID)
                FileDate\Created = DirectoryEntryDate(CurrentDirectoryID, #PB_Date_Created)
                FileDate\Modified = DirectoryEntryDate(CurrentDirectoryID, #PB_Date_Modified)
                FileDate\Accessed = DirectoryEntryDate(CurrentDirectoryID, #PB_Date_Accessed)
                FileAttributes = DirectoryEntryAttributes(CurrentDirectoryID)
                FileSize = DirectoryEntrySize(CurrentDirectoryID)
                ForEach Lpattern()
                    If lpattern() = "*" Or GetExtensionPart(UCase(FileName)) = lpattern()
                        FullFileName.s = StartDirectory + FileName
                        AddElement(LFiles())
                        Lfiles()\Name = FullFileName
                        Lfiles()\Date = FileDate
                        Lfiles()\Size = FileSize
                        Lfiles()\Attributes = FileAttributes
                        FileCount + 1
                    EndIf
                Next
            Else
                TempDirectory = DirectoryEntryName(CurrentDirectoryID)
                If TempDirectory <> "." And TempDirectory <> ".."
                    If Recursive = 1
                        Depth + 1
                        GetFileList(StartDirectory + TempDirectory + #Cdir, LFiles(), Pattern, Recursive)
                    EndIf
                EndIf
            EndIf
        Wend
        FinishDirectory(CurrentDirectoryID)
    EndIf
    ProcedureReturn FileCount
EndProcedure
Procedure SortFileListByDate(List InputFiles.file(), List OutPutFiles.file(), Order = #PB_Sort_Ascending, DateOption = #PB_Date_Modified, StartDate = 0, EndDate = $7FFFFFFF)
    Select DateOption
        Case #PB_Date_Modified
            SortStructuredList(InputFiles(), Order, (OffsetOf(File\Date) + OffsetOf(FileDate\Modified)), #PB_Integer)
        Case #PB_Date_Accessed
            SortStructuredList(InputFiles(), Order, (OffsetOf(File\Date) + OffsetOf(FileDate\Accessed)), #PB_Integer)
        Case #PB_Date_Created
            SortStructuredList(InputFiles(), Order, (OffsetOf(File\Date) + OffsetOf(FileDate\Created)), #PB_Integer)
    EndSelect
    If StartDate
        ForEach InputFiles()
            Select DateOption
                Case #PB_Date_Modified
                    If (InputFiles()\Date\Modified >= StartDate And InputFiles()\Date\Modified <= EndDate)
                        AddElement(OutPutFiles())
                        CopyStructure(@InputFiles(), @OutPutFiles(), File)
                    EndIf
                Case #PB_Date_Accessed
                    If (InputFiles()\Date\Modified >= StartDate And InputFiles()\Date\Accessed <= EndDate)
                        AddElement(OutPutFiles())
                        CopyStructure(@InputFiles(), @OutPutFiles(), File)
                    EndIf
                Case #PB_Date_Created
                    If (InputFiles()\Date\Modified >= StartDate And InputFiles()\Date\Created <= EndDate)
                        AddElement(OutPutFiles())
                        CopyStructure(@InputFiles(), @OutPutFiles(), File)
                    EndIf
            EndSelect
        Next
    EndIf
    ProcedureReturn ListSize(OutPutFiles())
EndProcedure
Procedure SortFileListBySize(List InputFiles.file(), List OutPutFiles.file(), Order = #PB_Sort_Ascending, MinimumSize = 0, MaximumSize.q = $7FFFFFFFFFFFFFFF)
    SortStructuredList(InputFiles(), Order, OffsetOf(File\Size), #PB_Integer)
    If MinimumSize
        ForEach InputFiles()
            If (InputFiles()\Size >= MinimumSize And InputFiles()\Size <= MaximumSize)
                AddElement(OutPutFiles())
                CopyStructure(@InputFiles(), @OutPutFiles(), File)
            EndIf
        Next
    EndIf
    ProcedureReturn ListSize(OutPutFiles())
EndProcedure
Global NewList AllFiles.File()
Global NewList FilteredFiles.File()
Global NewList ReFilteredFiles.File()
Global StartDate = Date(2014, 1, 1, 0, 0, 0)
Global EndDate = Date(2022, 12, 31, 23, 59, 59)
Global path.s = #PB_Compiler_Home
If GetFileList(path, AllFiles(), "*.pb|*.pbi")  ;get all pb files in the directory recursively
    If SortFileListByDate(Allfiles(), FilteredFiles(), #PB_Sort_Ascending, #PB_Date_Modified, StartDate, EndDate) ;sort and filter by date between dates
        ForEach FilteredFiles()
            Debug FilteredFiles()\Name
            Debug FormatDate("%dd/%mm/%yyyy", FilteredFiles()\Date\Modified)
        Next
    EndIf
    Debug "++++++++++++++++++++++++++++++++++++++++++++++++++"
    If SortFileListBySize(FilteredFiles(), ReFilteredFiles(), #PB_Sort_Descending, 10000, 100000) ;re-sort and filter by size between sizes
        ForEach ReFilteredFiles()
            Debug ReFilteredFiles()\Name
            Debug Str(ReFilteredFiles()\Size / 1024) + " KB"
        Next
    EndIf
EndIf