0

我有一些这样的代码:

void MainWindow::saveData()
{
    QDir oldDir=QDir::current();//this should return the main executable directory.Since there is no other place in my hole code where i temper with QDir.
    QDir sess("Sessions");
    if(!oldDir.exists("Sessions"))//if "Sessions" Dir doesn't exist 
        oldDir.mkdir("Sessions");//create it.
    QDir::setCurrent(sess.absolutePath());
    //some virtual code inside current Dir, which i didn't implement yet.
    QDir::setCurrent(oldDir.absolutePath());//restore old dir
}

当我第一次运行我的应用程序时,代码运行良好。但在第二次运行中,第一次调用QDir::current();返回“会话”目录而不是主可执行目录,因为它应该在第一次运行中恢复。实际上我确实设法克服了这个通过在代码的 biginning 添加一行,以下内容:

QDir::setCurrent(QCoreApplication::applicationDirPath());

我仍然想知道为什么第一个代码不起作用。已经检查了函数的文档,但什么也没找到。

4

2 回答 2

0

我尝试使用下面的代码,它可以很好地运行几次。Qt 和 OS 的版本详细信息可能会有所帮助。

Qt 创建者 3.3.2(开源)。Qt lib 5.4.1.Os windows 8.1

    #include <QCoreApplication>
#include "QDir"
#include "qDebug"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir oldDir=QDir::current();
    qDebug()<<QDir::current().absolutePath();
    QDir sess("H:\\cuteapps\\session");
    if(!oldDir.exists("H:\\cuteapps\\session"))//if "Sessions" Dir doesn't exist
         oldDir.mkdir("H:\\cuteapps\\session");//create it.
    QDir::setCurrent(sess.absolutePath());
    qDebug()<<QDir::current().absolutePath();
    return a.exec();
}

output 1:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"

output 2:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"

output 3:
"H:/cuteapps/build-untitled2-Desktop_Qt_5_4_1_MSVC2012_OpenGL_32bit-Debug"
"H:/cuteapps/session"
于 2015-06-29T21:57:33.987 回答
0

QDir::current();//这应该返回主可执行目录

不,不应该!除非您将其更改为首先指向那里。

当我这样说的时候,我是认真的:你是一个神话,幻想,不管你怎么称呼它,我不知道是什么给了你这个想法。给我指出一个这样说的规范。哦,你不能,因为没有这样的规范,没有这样的要求。这是某人的暮光之城海市蜃楼,似乎永无止境地延续着自己。如果您是从某人那里听到的,那么此刻您完全有权对他们生气,因为他们对您造成了很大的伤害。

一般来说,对于通常不从命令行启动的应用程序,初始工作目录可以是任何东西,并且取决于平台会话/系统配置。对于典型的 GUI 应用程序,假设任何特定的初始工作目录都是徒劳的,而且完全是错误的。

一旦将其更改为您希望它指向的位置,您当然可以完全控制它,但必须假定初始工作目录是随机的并且不受您的控制。

例如,在 Windows 上,我可以通过资源管理器快捷方式启动您的应用程序,在这里我可以指定我想要的任何启动文件夹,并且您对它的控制为零。在 OS X 上,Finder 将工作目录设置为某个东西,IIRC 设置为应用程序包所在的文件夹。同样,您作为开发人员无法控制它,除非捆绑包中有一些设置可以添加到该效果中,但这是特定于平台的,如果您的应用程序不是通过 Finder 或捆绑 API 机制启动(它们可能被称为别的东西)。等等。它完全是任意的,依赖于它的初始值是没有意义的。

如果要引用应用程序的安装目录或可执行目录,请明确执行。不要假设有关 GUI 应用程序的初始工作目录的任何内容。

于 2015-06-30T23:38:01.327 回答