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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFtp проверить наличие папки  (Прочитано 3640 раз)
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; выдает пустое значение
« Последнее редактирование: Февраль 13, 2015, 23:41 от Leviafan » Записан
Leviafan
Гость
« Ответ #1 : Февраль 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();

в цикле мелькает, а без этой части не работает
Записан
popper
Гость
« Ответ #2 : Февраль 14, 2015, 16:50 »

Замечание:
если на каком-то уровне папки нет и была выполнена команда mkdir, дальше нужно организовать вложенный цикл и создать все вложенные подпапки, после этого выход из основного цикла
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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