Russian Qt Forum

Qt => Общие вопросы => Тема начата: SABROG от Декабрь 26, 2009, 22:41



Название: QFile setFileName QDir::setCurrent
Отправлено: SABROG от Декабрь 26, 2009, 22:41
У меня есть список с указателями на QFile, изначально экземпляры создаются как new QFile(), т.е. в конструктор ничего не передается. А потом я уже через метод QFile::setFileName() ставлю имена файлам. Делается это для того, чтобы мне не мешались пути к файлам, которых еще не существует, т.е. пользователь эти пути выберет позже. Так вот таким образом я сохраняю файлы:

Код:
    QDir dir(path);
    if (!dir.exists())
        return false;

    QDir::setCurrent(path);
    ...
        QFile &file = *i->file();

        if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
            return false;

        file.write(i->data());

При этом все эти файлы создают в папке с программой (.exe файлом), какую бы я ни установил текущую директорию.

Документация к методу QFile::setFileName() говорит следующее:

Цитировать
If the file name has no path or a relative path, the path used will be the application's current directory path at the time of the open() call.

При этом приводится пример:

Код:
 QFile file;
 QDir::setCurrent("/tmp");
 file.setFileName("readme.txt");
 QDir::setCurrent("/home");
 file.open(QIODevice::ReadOnly);      // opens "/home/readme.txt" under Unix

Так все-таки какой путь испольуется: current directory или application's current directory ?

Судя по тому, что у меня ничего не выходит используется application's current directory, значит ошибка в документации и пример троллей не работает. Или ошибка в Qt?


Название: Re: QFile setFileName QDir::setCurrent
Отправлено: Dendy от Декабрь 26, 2009, 22:49
Это одно и то же. Вообще менять текущую директорию - моветон, делайте так только если точно знаете чего хотите, в данном случае это не нужно. Представьте что разные модули в программе будут параллельно менять директорию туда-сюда, в итоге файлы будут читаться/писаться куда попало.

Выведите в лог file.fileName(), чтобы убедиться, что путь относительный.

Вообще правильно пользоваться перед открытием: file.setFileName( dir.filePath( fileName ) ), а не QDir::setCurrent( dir ) + file.setFileName( fileName ).


Название: Re: QFile setFileName QDir::setCurrent
Отправлено: SABROG от Декабрь 26, 2009, 22:57
У меня изначально в классе членом был обычный QString fileName, я потом заменил его на указатель QFile. Пришлось еще сюда приплести QSharedPointer, чтобы класс мог без проблем копироваться в контейнер. Думал с указателем на QFile будет больше возможности развернуться. Значит теперь обратно придется все менять на QString.

Я так попробовал, это работает.

Код:
        QString fileName = file.fileName();
        file.setFileName(path + "/" + fileName);

        if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
            return false;

        qDebug() << file.fileName();
        file.write(i->data());
        file.close();
        file.setFileName(fileName);
        qDebug() << file.fileName();

Но это опять же моветон, гонять имя файла туда сюда. А тем временем косяк остается косяком. QDir::current() показывает ту директорию, которую я выбирал для сохранения файла, однако же файлы упорно сохраняются в папку с программой. Мне нужно подтверждение этого бага и я смогу отправить багрепорт троллям.


Название: Re: QFile setFileName QDir::setCurrent
Отправлено: Dendy от Декабрь 26, 2009, 23:08
Гонять имена файлов туда-сюда - единственно верное решение.


Название: Re: QFile setFileName QDir::setCurrent
Отправлено: SABROG от Декабрь 26, 2009, 23:16
Гонять имена файлов туда-сюда - единственно верное решение.

В общем я уже сделал обратный рефакторинг класса. Всё работает. Меня сейчас интересует документация, раз тролли говорят, что при отсутствии пути в имени файла должна использоваться текущая директория, то почему она не используется.


Название: Re: QFile setFileName QDir::setCurrent
Отправлено: Igors от Декабрь 26, 2009, 23:21
Я не смог получить полное имя от QFile, но его можно взять через QFileInfo