Описание функции


FileSearch

Поиск файлов в папке включая подкаталоги.

FileSearch(*Result.string, sPath.s, Mask$ = "*", depth = 130)

Параметры

*Result.string Указатель на структуру строки, в которую будет помещён результат
sPath.s Путь к папке
Mask$ Маска/фильтр файлов (Wildcard)
depth Глубина поиска. Если указать 0, то файлы только в текущей папке

Возвращаемое значение

Возвращает список файлов в виде многострочного текста, но можно переделать вывод данных, чтобы возвращать List().

Пример

; AZJIO
; https://www.purebasic.fr/english/viewtopic.php?p=566355#p566355
EnableExplicit

Procedure FileSearch(*Result.string, sPath.s, Mask$ = "*", depth = 130)
    Protected Len, *Point
    Protected NewList Files.s()

    Protected sName.s, c = 0
    Protected Dim aExaDir(depth)
    Protected Dim aSePath.s(depth)

    If Right(sPath, 1) <> #PS$
        sPath + #PS$
    EndIf

    aSePath(c) = sPath
    aExaDir(c) = ExamineDirectory(#PB_Any, sPath, Mask$)
    If Not aExaDir(c)
        ProcedureReturn
    EndIf

    Repeat
        While NextDirectoryEntry(aExaDir(c))
            sName = DirectoryEntryName(aExaDir(c))
            If sName = "." Or sName = ".."
                Continue
            EndIf
            If DirectoryEntryType(aExaDir(c)) = #PB_DirectoryEntry_Directory
                If c >= depth
                    Continue
                EndIf
                sPath = aSePath(c)
                c + 1
                aSePath(c) = sPath + sName + #PS$
                aExaDir(c) = ExamineDirectory(#PB_Any, aSePath(c), Mask$)
                If Not aExaDir(c)
                    c - 1
                EndIf
            Else
                If AddElement(Files())
                    Files() = aSePath(c) + sName
                EndIf
            EndIf
        Wend
        FinishDirectory(aExaDir(c))
        c - 1
    Until c < 0

    Debug "Depth = " + Str(depth)
    Debug "Count = " + Str(ListSize(Files()))
    Len = 0
    ForEach Files()
        Len + Len(Files()) + 2
    Next

    *Result\s = Space(Len)
    *Point = @*Result\s
    ForEach Files()
        CopyMemoryString(Files() + #CRLF$, @*Point)
    Next

    ClearList(Files())
EndProcedure

Define StartTime = ElapsedMilliseconds()
Define Path$ = "/home/user"
Define Path$ = GetTemporaryDirectory()
Define Result.string
FileSearch(@Result, Path$, "*.exe", 2) ; Wildcard, *.exe
Define Time.s = "Time = " + Str(ElapsedMilliseconds() - StartTime) + " ms"

Debug Time
Debug "_______________"
Debug Result\s