Russian Qt Forum

Qt => Работа с сетью => Тема начата: Leviafan от Февраль 13, 2015, 23:37



Название: QFtp проверить наличие папки
Отправлено: Leviafan от Февраль 13, 2015, 23:37
Код:
     QFile file("/home/leviafan/tmp/Новая папка/multiMAN ver 04.05.00 DEX (20120827)/инструкция DEX.txt");
     QFileInfo fileInfo(file);
     QStringList list1 = fileInfo.path().split("/", QString::SkipEmptyParts);
     ftp.connectToHost("192.168.1.1", 21);
     ftp.login("root", "123456");
     ftp.cd("DISK_A1/test/");
     for(int i=0; i < list1.count(); i++)
     {
         ftp.mkdir(list1[i]);
         ftp.cd(list1[i]);
     }
    if(file.open(QIODevice::ReadOnly))
    {
        ftp.put(&file, fileInfo.fileName());
    }
    QEventLoop loop;
    connect(&ftp,SIGNAL(done(bool)),&loop,SLOT(quit()));
    loop.exec();
    ftp.close();
Хочу скопировать на фтп сервер много файлов которые будут в разных папках , но никак не могу придумать как это сделать. Путь к файлу разделяю на название папок и сохраняю названия папок в QStringList list1, далее через цикл перебираю названия папок попутно создавая на фтп сервере соответствующую папку и перехожу в нее. Потом копирую файл, тут проблем нет, все работает, но вот если я начинаю проделывать данную процедуру с другим фалом, то ничего не получается, то есть я создаю папку которая уже есть на сервере и естественно папка не создается, и цикл не выполняется.
Код:
     for(int i=0; i < list1.count(); i++)
     {
         ftp.mkdir(list1[i]);
         ftp.cd(list1[i]);
     }
как сожно проверить существование папки и вставить все это дело в цикл?

Пробовал через QUrlInfo
Код:
    ftp.list();
    connect(&ftp, SIGNAL(listInfo(QUrlInfo)),this, SLOT(addToList(QUrlInfo)));

void MainWindow::addToList(const QUrlInfo &urlInfo)
{
   ftplist.append(urlInfo.name().toLatin1());
}
ftplist получает список файлов и папок, но как его влепить в мой цикл? в момент выполнения цикла ftplist еще не заполнен

Пробовал писать вот так
Код:
     for(int i=0; i < list1.count(); i++)
     {
        ftp.list();
        connect(&ftp, SIGNAL(listInfo(QUrlInfo)),this, SLOT(addToList(QUrlInfo)));
        qDebug() <<  ftplist;
        ftp.mkdir(list1[i]);
        ftp.cd(list1[i]);
     }
qDebug() <<  ftplist; выдает пустое значение


Название: Re: QFtp проверить наличие папки
Отправлено: Leviafan от Февраль 14, 2015, 00:49
кажись придумал  ::)
Код:
     QFile file("/home/leviafan/tmp/Новая папка/multiMAN ver 04.05.00 DEX (20120827)/инструкция DEX.txt");
     QFileInfo fileInfo(file);
     QStringList list1 = fileInfo.path().split("/", QString::SkipEmptyParts);
     ftp.connectToHost("192.168.1.1", 21);
     ftp.login("root", "123456");
     ftp.cd("DISK_A1/test/");
     for(int i=0; i < list1.count(); i++)
     {
        ftp.list();
        connect(&ftp, SIGNAL(listInfo(QUrlInfo)),this, SLOT(addToList(QUrlInfo)));
        QEventLoop loop;
        connect(&ftp, SIGNAL(done(bool)), &loop, SLOT(quit()));
        loop.exec();
        if(ftplist.indexOf(list1[i]) != -1) //ищем текущую папку в списке папкок
        {
            ftp.cd(list1[i]); //папка существует в текущей директории
        }
        else
        {
            ftp.mkdir(list1[i]); //папка не существует, создаем ее
            ftp.cd(list1[i]);
        }
        ftplist.clear(); //очищаем лист
     }
    if(file.open(QIODevice::ReadOnly))
    {
        ftp.put(&file, fileInfo.fileName());
    }
    QEventLoop loop;
    connect(&ftp, SIGNAL(done(bool)), &loop, SLOT(quit()));
    loop.exec();
    ftp.close();
Код:
void MainWindow::addToList(const QUrlInfo &urlInfo)
{
    if(urlInfo.isDir())
    ftplist.append(urlInfo.name().toLatin1()); //для файлов сделаю потом
}
вроде как работает, но смущает то, что
   QEventLoop loop;
    connect(&ftp, SIGNAL(done(bool)), &loop, SLOT(quit()));
    loop.exec();

в цикле мелькает, а без этой части не работает


Название: Re: QFtp проверить наличие папки
Отправлено: popper от Февраль 14, 2015, 16:50
Замечание:
если на каком-то уровне папки нет и была выполнена команда mkdir, дальше нужно организовать вложенный цикл и создать все вложенные подпапки, после этого выход из основного цикла