1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/baickl-vfs

Клонировать/Скачать
README.md 6.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 14.03.2025 07:29 d69e6aa

Введение

Это универсальная система пакетирования файлов для кросс-платформенного использования, поддерживающая Linux и Windows. Система используется при выпуске программного обеспечения или предоставлении серверной среды для третьих сторон для управления и шифрования собственных файловых ресурсов. Файловая система написана на чистом C и может адаптироваться к различным проектам и платформам.

Ссылки:

  1. Перейти на GitHub
  2. Перейти на OSChina

Инструкция по использованию

Шаг 1:


При запуске программы вызвать vfs_create и указать рабочий каталог программы

Пример кода:

if (VFS_FALSE == vfs_create(VFS_SDK_VERSION, "workpath"))
    return -1;

Шаг 2:


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

Пример кода:

vfs_add_archive("script.pak", "");
vfs_add_archive("effect.pak", "");
vfs_add_archive("a/b/c/scene.pak", "");

Эти API используются для имитации работы с директориями. Например, если текущая структура каталога выглядит так:```plaintext workpath |-------/script -> после упаковки становится script.pak |-------/effect -> после упаковки становится effect.pak |-------/a/b/c/scene -> после упаковки становится /a/b/c/scene.pak, можно также упаковать a как a.pak

во время разработки мы используем относительные пути для чтения данных. Например, в директории `script` есть файл `_init_.lua`, поэтому наш метод чтения будет таким:

```c
struct vfs_stream *stream = vfs_stream_open("script/_init_.lua");
if (!stream) {
    return VFS_FALSE;
}

/* Обработка чтения */
vfs_stream_read(stream, buf, size, count);

/* Закрытие */
vfs_stream_close(stream);
stream = NULL;

При чтении данных, если существует только директория script, но отсутствует файл script.pak, мы будем читать данные из директории script. Это то, что обычно называют режимом разработки. В режиме разработки совершенно не требуется упаковывать какие-либо директории. Как только разработка завершена, перед тестированием или выпуском версии, можно упаковать соответствующие директории с помощью функции pack_dir.

  • Внимание: каждая упакованная директория должна находиться в том же уровне каталогов при отправке на тестирование или выпуск, и не должна перемещаться. В противном случае программа не сможет правильно считывать данные.

Шаг 3:


Чтобы прочитать файл в программе, достаточно использовать относительный путь. ```Например, был файл map0.scene в директории `a/b/c/scene:`

Для чтения файла используйте следующий код:

struct vfs_stream *stream = vfs_stream_open("a/b/c/scene/map0.scene");
if (!stream)
    return VFS_FALSE;

/* Ваш код для чтения */
vfs_stream_read(stream, buf, size, count);

/* Закрытие */
vfs_stream_close(stream);
stream = NULL;

Если вы собираетесь архивировать директорию scene, обязательно поместите файл scene.pak в ту же директорию, где раньше находился scene.

Структура директорий после архивации будет такой:

workpath
|-------/script.pak
|-------/effect.pak
|-------/a/b/c/scene.pak

Вы также можете выбрать архивацию директории a, что приведёт к следующей структуре директорий:

workpath
|-------/script.pak
|-------/effect.pak
|-------/a.pak

Конечно, вам потребуется изменить ваш код инициализации PAK:

Исходный код:

vfs_add_archive("script.pak", "");
vfs_add_archive("effect.pak", "");
vfs_add_archive("a/b/c/scene.pak", "");

Обновлённый код:

vfs_add_archive("script.pak", "");
vfs_add_archive("effect.pak", "");
vfs_add_archive("a.pak", "");

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

Шаг 4:


При завершении программы необходимо вызвать соответствующие функции завершения, чтобы освободить данные.

Добавьте следующий код в место завершения программы:

vfs_destroy();

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/baickl-vfs.git
git@api.gitlife.ru:oschina-mirror/baickl-vfs.git
oschina-mirror
baickl-vfs
baickl-vfs
master