QT — копирование файла в AppData

Моя программа предлагает пользователю выбрать файл для обработки. Моя программа обрабатывает его и пытается сохранить файл в AppData.

Вот как я это делаю:

QSettings settings(QSettings::IniFormat, QSettings::UserScope, "FlameTool", "FlameTool");
addin_path = QFileInfo(settings.fileName()).absolutePath() + "/addins/" + id + ".limod" ;
qDebug(addin_path.toLocal8Bit());

if(QFile::copy(QDir::toNativeSeparators(file_passed),QDir::toNativeSeparators(addin_path)))
    qDebug("copied");
else
    qDebug("not copied");

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


person movildima    schedule 10.03.2014    source источник
comment
Совет по отладке: если функция дает сбой, проверьте переданные ей фактические значения аргументов. Надежный способ получить реальные значения - поместить их во временные переменные (если они еще не в переменной), передать их в качестве аргументов и установить точку останова в строке вызова или просто распечатать их.   -  person hyde    schedule 11.03.2014
comment
Совет Qt: вам не нужно toNativeSeparators с функциями Qt.   -  person hyde    schedule 11.03.2014


Ответы (2)


Чтобы делать то, что вы хотите, я хотел бы вместо этого использовать класс QStandardPaths:

Задайте имя приложения, например, main.cpp

int main(...)
{
    [..]
    a.setApplicationName("FlameTool");
}

Скопируйте файл:

QString addin_path = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
QDir dir(addin_path);
if (!dir.exists())
    dir.mkpath(addin_path);
if (!dir.exists("addins"))
    dir.mkdir("addins");

dir.cd("addins");
addin_path = dir.absoluteFilePath(id + ".limod");
if (QFile::exists(addin_path))
    QFile::remove(addin_path);

if(QFile::copy(file_passed, addin_path))
    qDebug("copied");
else
    qDebug("not copied");

Также обратите внимание, что:

Обратите внимание, что если файл с именем newName уже существует, функция copy() возвращает false (т. е. QFile не перезапишет его).

person vahancho    schedule 10.03.2014
comment
Хорошо, с некоторыми изменениями в коде, используя QStandardLocations вместо QDesktopServices, и это работает! Дело в том, что мне нужно, чтобы он писал в AppData\Roaming\, а не в AppData\Local\ . Есть ли способ найти папку Roaming? - person movildima; 12.03.2014
comment
Что ж, я отмечу это как ответ, потому что это действительно помогло мне. - person movildima; 13.03.2014

Во-первых, вы должны удалить любой существующий (потому что это предотвратит копирование, так как QFile::copy не перезаписывает существующий файл) файл и предупредить, если удалить невозможно. Во-вторых, вы должны проверить путь назначения.

person user2672165    schedule 10.03.2014