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\ . Има ли начин да се намери папка Роуминг? - person movildima; 12.03.2014
comment
Е, ще отбележа това като отговор, защото наистина ми помогна. - person movildima; 13.03.2014

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

person user2672165    schedule 10.03.2014