QT QDir::entryList 在发布中不起作用

QT QDir::entryList not working in release

本文关键字:布中 不起作用 entryList QDir QT      更新时间:2023-10-16

我有一个奇怪的问题。

在QT中,我的应用程序工作正常,但是当我运行.exe文件时,方法QDir::entryList不起作用...我不知道为什么。路径等已设置。

QDir pdir(cs.protocolDir);
QString log;
log.append(QString("[LPR] Trying to fetch protcol filesn"));
QStringList filter("*.txt");
Message locMSG;
QStringList flist = pdir.entryList(QStringList(filter),
                                   QDir::Files | QDir::NoSymLinks);

foreach (QString str, flist) {
    QString filename = QString("%1%2").arg(cs.protocolDir).arg(str);
    log.append(QString("[LPR]Filename: %1n").arg(filename));
    QFile file(filename);
    //and so on...

我希望有人可以帮助我解决这个问题。感谢

如果未找到构造 QDir 的路径QDir::entryList()它将静默失败并返回空列表。 尝试插入:

if (!pdir.exists())
{
    log.append(QString("[LPR] Path %1 does not exist - PWD is %2").arg(cs.protocolDir).arg(QDir::currentPath()));
}

。就在第一个日志语句之后,查看是否找到该目录。

cs.protocolDir 中的路径是相对路径吗? 如果"在Qt中"是指直接从Qt Creator运行它,那么Qt Creator将设置一个"工作目录",默认情况下是二进制文件的位置。 也许它在这种情况下有效,因为路径是相对于二进制文件计算的。

运行

可执行文件时,工作目录将是运行二进制文件时所在的任何目录(如果从命令行运行);或者操作系统选择的某个目录。

如果这是问题所在,则需要改用绝对路径。

这一切都与定时/同步有关!

引用的 DIR 在执行 entryList 的那一刻还没有准备好,我将解释为什么在调试模式下工作:

在调试模式下,收集器、观察程序和许多其他结构会有一些(不)明显的延迟,以允许有效的调试,这会降低性能。

因此,如果目录是动态目录(网络、闪存驱动器、虚拟等),则可能需要等待一段时间,直到该目录完全由操作系统构建并准备好访问!

您可以在使用路径初始化 QDir 之前轻松尝试进入睡眠状态。更改睡眠功能的延迟量,以了解FS/SO的必要时间;

这可能是因为当您从Qt创建器或Visual Studio以调试模式运行应用程序时,以及通过双击运行exe文件时,执行路径不同。尝试记录绝对路径 QDir::absolutePath(),并尝试在 cs.protocolDir 中使用绝对路径。