PureBasic

Руководство - Хранение данных в памяти

Этот пример собирает информацию о файлах в корневом каталоге зарегистрированного пользователя в структурированный связный список. На данный момент вывод не очень привлекателен, но мы возвратимся к этому примеру позже и сделаем его более дружественным.

; В этом разделе описываются поля структуры или записи, главным образом используются целые числа,
; но обратите внимание на тип string для имени файла и тип quad для размера файла.
Structure FILEITEM
    Name.s
    Attributes.i
    Size.q
    DateCreated.i
    DateAccessed.i
    DateModified.i
EndStructure

; Теперь мы определяем новый список файлов, используя ранее определенную структуру
; и некоторые другие переменные, которые мы будем использовать позже.
NewList Files.FILEITEM()
Define.s Folder
Define.l Result

; Эта функция получает корневой каталог вошедшего в систему пользователя.
Folder = GetHomeDirectory()

; Открывает каталог, чтобы перечислить все его содержимое.
Result = ExamineDirectory(0, Folder, "*.*")

; Если Result - истина (т.е. каталог открыть удалось), начинаем перечисление записей.
If Result
    ; Цикл пока NextDirectoryEntry(0) не станет нулем - что означает, что больше нет записей.
    While NextDirectoryEntry(0)
        ;Если запись каталога - файл, а не папка.
        If DirectoryEntryType(0) = #PB_DirectoryEntry_File
            ; Добавить новый элемент к списку.
            AddElement(Files())
            ; И заполнить его свойствами файла.
            Files()\Name = DirectoryEntryName(0)
            Files()\Size = DirectoryEntrySize(0)
            Files()\Attributes = DirectoryEntryAttributes(0)
            Files()\DateCreated = DirectoryEntryDate(0, #PB_Date_Created)
            Files()\DateAccessed = DirectoryEntryDate(0, #PB_Date_Accessed)
            Files()\DateModified = DirectoryEntryDate(0, #PB_Date_Modified)
        EndIf
    Wend
    ; Закрыть каталог.
    FinishDirectory(0)
EndIf

; Показывает список в окне отладки (если нет ни одной записи в каталоге, на экран ничего не выведется).
ForEach Files()
    Debug "Filename = " + Files()\Name
    Debug "Size = " + Str(Files()\Size)
    Debug "Attributes = " + StrU(Files()\Attributes)
    Debug "Created = " + StrU(Files()\DateCreated)
    Debug "Accessed = " + StrU(Files()\DateAccessed)
    Debug "Modified = " + StrU(Files()\DateModified)
Next Files()

Далее, во-первых даты выводятся как простые числа - это не очень хорошо, поэтому давайте их преобразим в знакомый вид. Для этого нужно заменить последние три оператора Debug, как показано ниже:

...
Debug "Created = " + FormatDate("%dd/%mm/%yyyy", Files()\DateCreated)
Debug "Accessed = " + FormatDate("%dd/%mm/%yyyy", Files()\DateAccessed)
Debug "Modified = " + FormatDate("%dd/%mm/%yyyy", Files()\DateModified)

Функция FormatDate() принимает значение даты в собственном числовом формате PureBasic и отображает ее согласно заданной Вами маске. Таким образом, отображение даты на экране, становится более читаемым.

И наконец, на данный момент, список не отсортирован в каком либо порядке, поэтому прежде чем вывести на экран, давайте его отсортируем . Добавьте эту строку перед комментарием о показе списка и цикла ForEach.

...

; Сортируем список, путём упорядочения имён файлов в возрастающем алфавитном порядке (A, B, C, D...).
SortStructuredList(Files(), #PB_Sort_Ascending, OffsetOf(FILEITEM\Name), #PB_String)

; Показывает список в окне отладки (если нет ни одной записи в каталоге, на экран ничего не выведется)
...

Эта команда берет структурированный связный список и сортирует его в порядке возрастания алфавита (#PB_Sort_Ascending) поля Name в структуре (OffsetOf (FILEITEM\Name)), которое является строковым значением (#PB_String).

Навигация Руководства

< Обработка строк - Обзор - Ввод & Вывод >