Russian Qt Forum
Ноябрь 26, 2024, 19:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFile setFileName QDir::setCurrent  (Прочитано 8440 раз)
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?
Записан
Dendy
Гость
« Ответ #1 : Декабрь 26, 2009, 22:49 »

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

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

Вообще правильно пользоваться перед открытием: file.setFileName( dir.filePath( fileName ) ), а не QDir::setCurrent( dir ) + file.setFileName( fileName ).
Записан
SABROG
Гость
« Ответ #2 : Декабрь 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() показывает ту директорию, которую я выбирал для сохранения файла, однако же файлы упорно сохраняются в папку с программой. Мне нужно подтверждение этого бага и я смогу отправить багрепорт троллям.
Записан
Dendy
Гость
« Ответ #3 : Декабрь 26, 2009, 23:08 »

Гонять имена файлов туда-сюда - единственно верное решение.
Записан
SABROG
Гость
« Ответ #4 : Декабрь 26, 2009, 23:16 »

Гонять имена файлов туда-сюда - единственно верное решение.

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 26, 2009, 23:21 »

Я не смог получить полное имя от QFile, но его можно взять через QFileInfo 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.