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


ScanDir

Поиск папок и файлов в папке включая подкаталоги, создавая древовидную структуру данных для вывода в TreeView.

ScanDir(*s.Tree, AllDir.s)

Параметры

**s.Tree Древовидная структура
AllDir.s Путь к папке

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

Возвращает размер данных в папке.

Пример

; Пётр
; http://purebasic.mybb.ru/viewtopic.php?id=810#p8227
Structure Files
    Name.s ; Имя файла
    Size.q ; Размер файла
EndStructure

Structure Tree
    DirName.s ; Имя папки.
    DirSize.q
    List Files.Files() ; Список файлов текущей папки.
    List Dirs.Tree() ; Список вложенных папок текущей папки.
EndStructure


Procedure.q ScanDir(*s.Tree, AllDir.s) ; Сохранение структуры указаной папки
    Protected Size.q = 0, id, Dir.s

    If *s = 0
        ProcedureReturn 0
    EndIf

    id = ExamineDirectory(#PB_Any, AllDir, "*.*")
    If id

        While NextDirectoryEntry(id)

            If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory ; Папка

                Dir = DirectoryEntryName(id)
                If Dir <> "." And Dir <> ".."

                    If AddElement(*s\Dirs())
                        *s\Dirs()\DirName = Dir
                        Size + ScanDir(*s\Dirs(), AllDir + Dir + #PS$) ; Рекурсивный вызов процедуры
                    EndIf

                EndIf

            Else ; Файл

                If AddElement(*s\Files())
                    *s\Files()\Name = DirectoryEntryName(id)
                    *s\Files()\Size = DirectoryEntrySize(id)
                    Size + *s\Files()\Size
                EndIf

            EndIf

        Wend

        *s\DirSize = Size
        FinishDirectory(id)
    EndIf

    ProcedureReturn Size
EndProcedure


Procedure View(*s.Tree, Pos) ; Отображение содержимого папки.

    AddGadgetItem(0, -1, *s\DirName + " (" + *s\DirSize + ") байт", 0, Pos)

    Pos + 1

    ForEach *s\Dirs() ; Отображение всех подпапок текущей папки.
        View(*s\Dirs(), Pos) ; Рекурсивный вызов процедуры
    Next

    ForEach *s\Files() ; Отображение списка файлов текущей папки.
        AddGadgetItem(0, -1, *s\Files()\Name + " (" + *s\Files()\Size + ") байт", 0, Pos)
    Next
EndProcedure

Define Event
Define s.Tree ; Создание экземпляра структуры.

s\DirName = PathRequester("Папка для сканирования", "")
If s\DirName
    OpenWindow(0, 0, 0, 400, 400, "", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
    TreeGadget(0, 0, 0, 400, 400)
    ScanDir(s, s\DirName)
    View(s, 0)
    Repeat
        Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf