QtQDir::current()

У меня был такой код:

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(); возвращает каталог «Сеансы», а не основной исполняемый каталог, поскольку он должен быть восстановлен при первом запуске. на самом деле мне удалось преодолеть это путем добавления одной строки в начале кода:

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

Тем не менее я хочу знать, почему первый код не работал. Уже проверил документацию функций и ничего не нашел.


person coucou8949    schedule 29.06.2015    source источник
comment
this should return the main executable directory: Это не обязательно так. Пользователь может запустить ваше приложение с любым начальным рабочим каталогом.   -  person Francis Gagné    schedule 30.06.2015
comment
Я знаю это, и это правда. за исключением того, что прямо сейчас я единственный, кто запускает свое приложение, и, как я думаю, оно должно запускаться в своем правильном каталоге. Тем не менее, ваш комментарий дал мне подсказку о чем-то другом. Спасибо.   -  person coucou8949    schedule 30.06.2015
comment
он должен запускаться в соответствующем каталоге. Если вы не запускаете его из командной строки, он не должен. Если вы считаете иначе, укажите нам спецификацию, подтверждающую это убеждение.   -  person Kuba hasn't forgotten Monica    schedule 01.07.2015


Ответы (2)


QDir::current();//это должно вернуть главный исполняемый каталог

Нет, не должно! Нет, если только вы не измените его, чтобы он сначала указывал туда.

Я совершенно серьезен, когда скажу следующее: Это миф, фантазия, как бы вы это ни называли, я понятия не имею, что натолкнуло вас на эту идею. Укажите мне спецификацию, в которой это сказано. О, вы не можете, потому что нет такой спецификации, нет такого требования. Это чей-то мираж сумеречного часа, который, кажется, увековечивает себя бесконечно. Если вы услышали это от кого-то, вы имеете полное право рассердиться на них в эту же минуту, ибо они оказали вам большую медвежью услугу.

Вообще говоря, для приложений, которые обычно не запускаются из командной строки, начальный рабочий каталог может быть любым, и это будет платформа-и зависит от конфигурации сеанса/системы. Для типичного приложения с графическим интерфейсом предполагать, что какой-либо конкретный начальный рабочий каталог является дурацкой затеей и полностью ошибочным.

Как только вы измените его так, как вам нужно, вы, конечно, получите полный контроль над ним, но начальный рабочий каталог должен считаться случайным и неподконтрольным вам.

Например, в Windows я могу запустить ваше приложение с помощью ярлыка Проводника, где я могу указать любую желаемую папку запуска, и у вас нулевой контроль над ней. В OS X Finder устанавливает рабочий каталог на то или иное, IIRC на папку, в которой находится пакет приложений. Опять же, вы, как разработчик, не имеете никакого контроля над этим, если только в пакете нет каких-либо настроек, которые вы могли бы добавить для этого, но они зависят от платформы и будут игнорироваться, если ваше приложение не запускается через механизмы Finder или API пакета (они наверное как-то иначе называется). И так далее. Это совершенно произвольно, и бессмысленно зависеть от его начального значения.

Если вы хотите сослаться на каталог установки или исполняемый каталог приложения, сделайте это явно. Не делайте никаких предположений относительно начального рабочего каталога приложения с графическим интерфейсом.

person Kuba hasn't forgotten Monica    schedule 30.06.2015

Я пробовал с приведенным ниже кодом, и он отлично работает для нескольких прогонов. Информация о версии Qt и ОС может помочь.

Создатель 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"
person Jeet    schedule 29.06.2015
comment
что я хочу знать, так это: почему мой каталог программы current() по умолчанию при втором запуске соответствует каталогу Sessions, который я создал при первом запуске, а не основному (восстановленному) исполняемому каталогу. - person coucou8949; 30.06.2015