You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平台Qt 6.9.0迁移:std::filesystem无法遍历应用目录

Qt 6.9.0 Android平台下std::filesystem无法遍历应用目录的问题

我正在Android平台将代码从Qt 6.2.2迁移至Qt 6.9.0。此前用标准std::filesystem遍历应用目录查找.so插件,现在无法正常工作——能遍历HOME目录,但无法遍历应用目录。奇怪的是QDir可以正常完成遍历,但我的代码是纯C++/STL实现,不能在此层级使用Qt。

我想知道:

  • APK结构是否发生了变化?
  • 为什么STL无法识别应用目录?
  • 有没有可行的解决方案?

测试程序

#include <QApplication>
#include <QMainWindow>
#include <QLabel>
#include <QDebug>
#include <QDir>
#include <filesystem>
void listDirContent(QString path)
{
    {
        QDir dir(path);
        qDebug() << "Using Qt, " << path << ":";
        for (auto file : dir.entryList())
            qDebug() << file;
    }
    {
        std::filesystem::path std_path = path.toStdString();
        qDebug() << "using std, " << std_path.c_str() << ":";
        std::filesystem::directory_iterator itDir;
        std::filesystem::directory_iterator itEnd;
        std::filesystem::path Path;
        try
        {
            itDir = std::filesystem::directory_iterator(std_path);
            qDebug() << "Found files:";
            for (; itDir != itEnd; itDir++)
            {
                qDebug() << QString(itDir->path().c_str());
            }
            qDebug() << "end files";
        }
        catch (const std::exception& e)
        {
            qDebug() << "FAILED" << e.what();
        }
    }
}

int main( int argc, char* argv[] )
{
    QApplication app(argc, argv);
    QMainWindow wnd;
    wnd.setCentralWidget(new QLabel("Hello",&wnd));
    wnd.show();
    listDirContent(qApp->applicationDirPath());
    listDirContent(QDir::homePath());
    return app.exec();
}

程序输出

D/default (18701): Using Qt,  "/data/app/org.qtproject.example.TestListDir-UzLzgFYV8gnNNAzUQkD1Lw==/base.apk!/lib/armeabi-v7a" :
D/default (18701): "armeabi-v7a"
D/default (18701): "libc++_shared.so"
D/default (18701): "libplugins_iconengines_qsvgicon_armeabi-v7a.so"
D/default (18701): "libplugins_imageformats_qgif_armeabi-v7a.so"
D/default (18701): "libplugins_imageformats_qico_armeabi-v7a.so"
D/default (18701): "libplugins_imageformats_qjpeg_armeabi-v7a.so"
D/default (18701): "libplugins_imageformats_qsvg_armeabi-v7a.so"
D/default (18701): "libplugins_platforms_qtforandroid_armeabi-v7a.so"
D/default (18701): "libplugins_styles_qandroidstyle_armeabi-v7a.so"
D/default (18701): "libQt6Core_armeabi-v7a.so"
D/default (18701): "libQt6Gui_armeabi-v7a.so"
D/default (18701): "libQt6Svg_armeabi-v7a.so"
D/default (18701): "libQt6Widgets_armeabi-v7a.so"
D/default (18701): "libTestListDir_armeabi-v7a.so"
D/default (18701): using std,  /data/app/org.qtproject.example.TestListDir-UzLzgFYV8gnNNAzUQkD1Lw==/base.apk!/lib/armeabi-v7a :
D/default (18701): FAILED filesystem error: in directory_iterator::directory_iterator(...): No such file or directory ["/data/app/org.qtproject.example.TestListDir-FvVxa-eHXbBc9Zpa2Q0uGQ==/base.apk!/lib/armeabi-v7a"]
D/default (18701): Using Qt,  "/data/user/0/org.qtproject.example.TestListDir/files" :
D/default (18701): "."
D/default (18701): ".."
D/default (18701): "profileInstalled"
D/default (18701): "profileinstaller_profileWrittenFor_lastUpdateTime.dat"
D/default (18701): using std,  /data/user/0/org.qtproject.example.TestListDir/files :
D/default (18701): Found files:
D/default (18701): /data/user/0/org.qtproject.example.TestListDir/files/profileinstaller_profileWrittenFor_lastUpdateTime.dat
D/default (18701): /data/user/0/org.qtproject.example.TestListDir/files/profileInstalled
D/default (18701): end files

问题细节

从输出可见,std::filesystem无法遍历路径/data/app/org.qtproject.example.TestListDir-UzLzgFYV8gnNNAzUQkD1Lw==/base.apk!/lib/armeabi-v7a,提示目录不存在,但QDir可正常遍历该路径。

在Qt 6.2.2中,应用目录路径不含base.apk!,当时代码可正常遍历文件。我已提交Qt bug。

补充:std::filesystem可以遍历/data/app/org.qtproject.example.TestListDir-UzLzgFYV8gnNNAzUQkD1Lw==目录,将base.apk识别为文件。看起来QDir支持APK文件名后加!的特殊路径,可将其当作目录访问。

有没有办法解决这个问题?如何让std::filesystem能够访问应用目录?


内容的提问来源于stack exchange,提问作者jpo38

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:58:11