Копирование каталога и подкаталога

Привет, я пытаюсь скопировать каталог и все его содержимое. Я подумал, что хорошим началом будет перечислить все подкаталоги, чтобы я мог получить представление и скопировать подструктуру в папку назначения.

но мне нужно получить путь от QDir и далее, а не путь от корня машины, как мне это сделать, чтобы я получил sweetassurfwear/folder/folder вместо /usr/local /websites/sweetassurfwear/folder/folder

вот мой код до сих пор

QDir targetDir1("/home/brett/sweetback");
targetDir1.mkdir("sweetassurfwear");

QDir targetDir("/usr/local/websites/sweetassurfwear");
targetDir.setFilter(QDir::NoDotAndDotDot| QDir::Dirs | QDir::Files);
QDirIterator it(targetDir, QDirIterator::Subdirectories);
while (it.hasNext()) {
    QFileInfo Info(it.next().relativePath());
    QString testName = QString(Info.fileName());
    QString testPath = QString(Info.absoluteFilePath());
    if(Info.isDir()){
    //  QString cpd = "/home/brett/sweetback/sweetassurfwear/";
    //  targetDir.mkdir(cpd+testName);
        QString dirname = Info.filePath();
        ui.textEdit->append(QString("Copy Files " + dirname));
    }

}

person Brett    schedule 31.12.2013    source источник


Ответы (2)


Проблема в том, что, как я писал в комментарии, вы создаете информацию о файле с полным путем, а не с относительным путем, как вы хотите.

Существует два подхода, оба из которых представлены ниже, для решения проблемы:

1) Обходной путь заключается в том, чтобы вручную удалить «префикс» путем манипулирования строкой.

2) Лучшим решением было бы получить относительный путь из абсолютного и корневого путей, используя ссылку соответствующий удобный метод QDir.

main.cpp

#include <QDir>
#include <QDirIterator>
#include <QString>
#include <QFileInfo>
#include <QDebug>
int main()
{    
    QDir targetDir("/usr/local");
    targetDir.setFilter(QDir::NoDotAndDotDot| QDir::Dirs | QDir::Files);

    QDirIterator it(targetDir, QDirIterator::Subdirectories);
    while (it.hasNext()) {
        it.next();
        QFileInfo Info = it.fileInfo();
        QString testName = Info.fileName();

        // Work around
        // QString testPath = Info.absoluteFilePath().mid(it.path().size()+1);

        // Real solution
        QString testPath = QString(targetDir.relativeFilePath(Info.absoluteFilePath()));

        qDebug() << "TEST:" << testPath;
        if(Info.isDir()) {
            //  QString cpd = "/home/brett/sweetback/sweetassurfwear/";
            //  targetDir.mkdir(cpd+testName);
            QString dirname = Info.filePath();
        }
    }

    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

Создавайте и запускайте

qmake && make && ./main

Обратите внимание, что вам не нужно создавать информацию о файле на основе пути, поскольку экземпляр QDirIterator может возвращать его напрямую.

person lpapp    schedule 31.12.2013

Почему бы просто не использовать метод relativePath этого класса? Благодаря этому методу вы можете получить относительный путь из вашего пути -> ссылка

person ArthurLambert    schedule 31.12.2013
comment
Я получаю эту ошибку cpp: 33: ошибка: «класс QString» не имеет члена с именем «relativePath» - person Brett; 31.12.2013