Описание функции
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