Как преобразовать путь файла Qt из ресурса в абсолютный путь?

Мне нужно получить абсолютный путь к файлу, как

C:/Users/Dima/YandexDisk/_Application/WeldAnalysis/ExperimentDefaults.xlsx

из пути файла QRC, как

:/Data/ExperimentDefaults.xlsx,

Как я могу это сделать?

1 ответ

Решение

Ресурсы упакованы все вместе в файл QRC, они не подвергаются файловой системе, поэтому они не могут быть преобразованы в стандартный путь; это похоже на доступ к файлу внутри zip-файла.

Что вы готовы сделать с таким путем к файлу? QFile может иметь дело с путями ресурсов (":/...") и открывать такие файлы, но другие API обработки файлов этого не делают (например, C fopen или C++ std::ifstream). Кроме того, по той же причине приложение, не являющееся Qt, не сможет открывать такие файлы, если передано в качестве параметра.

Варианты у вас есть:

  • открытие файла с помощью QFile и читать его, используя связанные классы Qt (учитывая, что вы имеете дело с файлом Excel, я думаю, что это не стоит усилий, если у вас нет какой-либо библиотеки для чтения из буфера памяти).

  • копирование файла из контейнера ресурсов во временный каталог (вы можете использовать QTemporaryDir создать), и использовать файл оттуда:

    QTemporaryDir tempDir;
    if (tempDir.isValid()) {
      const QString tempFile = tempDir.path() + "/yourfile.xlsx";
      if (QFile::copy(":/yourfile.xlsx", tempFile)) {
        // your file is now extracted to the filesystem
      }
    }
    

Только знайте, что когда tempDir уничтожен, временный каталог также удален, поэтому ваш файл. Вы можете избежать этого, отключив функцию автоматического удаления: tempDir.setAutoRemove(false) и вручную удалить временный каталог, когда вы закончите с извлеченным файлом.

Другие вопросы по тегам