Сохранение файлов
Адаптер, которому необходимо хранить файлы, записывает их не в файловую систему, а в хранилище данных 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 Всем, кто использует это в качестве шаблона, следует проверить этот раздел.