我有这样的代码:
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
}当我首先运行我的应用程序时,代码在第二次运行时工作perfectly.but,第一个对QDir::current();的调用返回“会话”Dir,而不是主要的可执行Dir,因为它应该在第一个run.actually中恢复--我在代码编译时添加了一行代码,从而克服了这一点,如下所示:
QDir::setCurrent(QCoreApplication::applicationDirPath());不过,我还是想知道为什么第一段代码没有work.already检查函数的文档,却什么也没有发现。
发布于 2015-06-30 23:38:01
QDir::current();//这应该返回主可执行目录
不,它不应该!不应该,除非你先把它更改为指向那里。
当我这么说的时候,我是非常认真的: you是一个神话,幻想,无论你怎么称呼它,我都不知道是什么给了你这个想法。给了我一个这么说的规范。哦,你不能,因为没有这样的规格,没有这样的要求。这是一个人的黄昏时的海市蜃楼,似乎永无止境。如果你听到某人说的话,你完全有权在这一刻生他们的气,因为他们给了你很大的伤害。
一般来说,对于通常不是从命令行启动的应用程序,初始工作目录可以是任意的,并且它将依赖于平台和会话/系统配置。对于一个典型的GUI应用程序,假设任何特定的初始工作目录都是愚蠢的差事,并且完全被误导。
一旦将其更改为要指向的位置,当然可以完全控制它,但是必须假定初始工作目录是随机的,并且超出了的控制范围。
例如,在Windows上,我可以通过Explorer快捷方式启动您的应用程序,在这里我可以指定我想要的任何启动文件夹,而您对它的控制是零的。在OS上,Finder将工作目录设置为某样东西,IIRC设置为应用程序包所在的文件夹。同样,作为一个开发人员,您无法控制它,除非您可以在包中添加一些设置,但这是特定于平台的,如果您的应用程序不是通过Finder或bundle API机制启动的,就会被忽略(它们可能被称为其他东西)。诸若此类。它完全是任意的,依赖于它的初始值是毫无意义的。
如果要引用应用程序的安装目录或可执行目录,请显式地这样做。不假定应用程序的初始工作目录。
发布于 2015-06-29 21:57:33
我尝试了下面的代码,它在几次运行中运行良好。Qt和OS的版本细节可能会有所帮助。
Qt创建者3.3.2 (开源)。Qt 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"https://stackoverflow.com/questions/31125722
复制相似问题