2015-07-13 10 views
1

Я работаю над проектом Qt, который включает большой набор данных (70Mb +).Как упаковать большие данные в проект Qt?

Данные будут использованы библиотекой, которая обращается к ним с использованием пути данных.

Я знаю, что я могу нормально использовать ресурсы, но поскольку они находятся в объектах памяти, я не могу использовать их в библиотеке.

Итак, мой вопрос в том, как я могу упаковать файл или папку, чтобы он был доступен при установке/времени выполнения для доступа к любому пользователю?

+0

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

+0

Я сейчас упаковываю его в качестве ресурсов и копирую его во время выполнения, но оба они влияют на ux после установки. Я хотел бы рассмотреть другие варианты, прежде чем прибегать к этому. –

ответ

0

Так что, проведя больше времени с разработкой Qt и C++, вы вообще не нуждаетесь в Qt для этой функции.

Что нужно, чтобы изменить процесс строительства, чтобы отправить файлы, которые вам нужны, с двоичными файлами после завершения строительства.

Отличная новость заключается в том, что это очень просто с cmake.

Просто скопируйте все файлы, которые вы хотите иметь в своем распоряжении во время выполнения в выходной каталог после построения кода CMake, что делает это:

add_custom_command(TARGET ${PROJECT} POST_BUILD 
        COMMAND ${CMAKE_COMMAND} -E copy_directory 
         ${RES_DIR} $<TARGET_FILE_DIR:${PROJECT}>/RES/) 

где PROJECT это имя цели.

RES_DIR: полный путь к каталогу ресурсов.

1

Ресурсы доступны в памяти процесса, поэтому любая библиотека, которая используется в вашем процессе, имеет к ним доступ. Просто используйте класс QResource, чтобы узнать адрес и размер ресурса и передать его в библиотеку.

Если библиотека не может принимать указатель и размер к данным, но настаивает на файл, вы можете использовать QResource, QTemporaryFile и QFile::copy сбросить данные из исполняемого файла во временный файл, так что библиотека имеет с чем работать.

Библиотека должна иметь два способа: прием данных

  1. В процессе данные: адрес + размер. Например.

    setData(void * address, int size); 
    
  2. Данные, не относящиеся к процессу: путь к файлу + смещение + размер.

    setData(const char * filePath, void * offset = 0, int size = -1); 
    // size = -1 uses the entire file 
    

Это позволило бы библиотеку на:

  1. использования бинарных ресурсов, которые доступны в памяти процесса, приходят ли они от QResource или WinAPI ресурсов, или находящиеся во временных буферах после загрузки из сети и т. д.

  2. Используйте двоичные ресурсы, доступные в файлах, включая Qt и ресурсы Windows, которые доступный со смещением в сам исполняемый файл.

+0

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

+1

@ Mr.Me Исправьте библиотеку. Как минимум, библиотека должна принимать путь * и * смещение в файл. Затем вы можете указать библиотеку самому исполняемому файлу и предоставить смещение, в котором находится ресурс. Если нет, вам придется использовать 'QResource',' QTemporaryFile' и 'QFile :: copy', чтобы выгрузить ресурс во временный файл. –

+0

не может просто исправить библиотеку, я подниму вопрос для команды библиотеки, но Qt должен поддерживать упаковочные активы на всех платформах. –