Сохранение файлов

Адаптер, которому необходимо хранить файлы, записывает их не в файловую систему, а в хранилище данных ioBroker. Это означает, что они находятся в известном месте, независимо от операционной системы, видны через интерфейс в разделе «Файлы» и могут быть включены в резервные копии данных.

Место хранения — это объект.

Файлы всегда прикрепляются к объекту соответствующего типа.meta Этот объект является точкой монтирования; файлу присваивается путь относительно неё. Без такого объекта операция записи завершится неудачей.

Важная область — этоcommon.type :

common.typeЗначение
meta.userФайлы включены в резервную копию данных . Это относится ко всему, что невозможно воссоздать: ключам, сертификатам, загруженному контенту, файлам, созданным конкретными пользователями.
meta.folderЭти файлы не включены в резервную копию данных . Они предназначены для промежуточных состояний, временного хранения и всего, что адаптер может восстановить в любое время.

!> Поле называетсяcommon.type , нетcommon.role Проверка резервного копирования данных выполняется именно по этому параметру. Если там указано что-то другое, после восстановления файлы будут отсутствовать.

Создайте место хранения.

Самый простой способ сделать это — черезinstanceObjects Затем он автоматически создается в файле io-package.json для каждого экземпляра:

"instanceObjects": [
    {
        "_id": "keys",
        "type": "meta",
        "common": {
            "name": "Schlüssel",
            "type": "meta.user"
        },
        "native": {}
    },
    {
        "_id": "temp",
        "type": "meta",
        "common": {
            "name": "Zwischenspeicher",
            "type": "meta.folder"
        },
        "native": {}
    }
]

То же самое относится и к среде выполнения:

await this.setObjectNotExists('keys', {
    type: 'meta',
    common: { name: 'Schlüssel', type: 'meta.user' },
    native: {}
});

Письмо и чтение

Первый параметр всегда обозначает точку крепления, второй — путь под ней:

// schreiben
await this.writeFileAsync(`${this.namespace}.keys`, 'private-key.pem', privateKey);
await this.writeFileAsync(`${this.namespace}.temp`, 'cache.json', JSON.stringify(daten));

// lesen
const { file } = await this.readFileAsync(`${this.namespace}.keys`, 'private-key.pem');

// auflisten und löschen
const eintraege = await this.readDirAsync(`${this.namespace}.temp`, '');
await this.delFileAsync(`${this.namespace}.temp`, 'cache.json');

Подкаталоги создаются простым указанием пути:'zertifikate/2026/host.pem' .mkdirAsync Существует дополнительная опция, но она редко требуется. Содержимое состоит из строк и...Buffer Сюда входят изображения и архивные материалы, а также текст.

Общая папка

Помимо собственных точек крепления, имеются такжеmeta.user Это общая папка для пользовательских файлов. Она создается во время настройки и является рекомендуемым местом для загрузки в разделе « Файлы» интерфейса. Адаптер записывает данные в эту папку только в том случае, если файл явно принадлежит пользователю, а не ему самому.

частный случай dataFolder

Если адаптеру требуются реальные файлы в файловой системе, например, потому что к ним обращается сторонняя программа, это можно настроить в файле конфигурации.common.dataFolder Укажите папку. Резервная копия данных будет включать эту папку. Путь указан черезmeta -objects по-прежнему является лучшим вариантом, поскольку он также работает с многохостовыми системами и в контейнерах.

Практические правила

  • Всё, что должно быть восстановлено после реставрации, должно находиться под...meta.user .
  • Все, что адаптер может перестроить при следующем запуске, относится к определенной категории.meta.folder Это позволяет уменьшить размер резервной копии данных.
  • Держите их раздельно, вместо того чтобы бросать все в одну кастрюлю.

Насколько легко эти два поля могут быть перепутаны, демонстрирует адаптер sayit : его корневой объект корректно отображает"type": "meta.user" , объектtts.userfiles кроме того, однако"role": "meta.user" Таким образом, содержащиеся в нем звуковые файлы не включены в резервную копию данных. Любой, кто использует устройство стороннего производителя...io-package.json Всем, кто использует это в качестве шаблона, следует проверить этот раздел.