Название: 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, дальше нужно организовать вложенный цикл и создать все вложенные подпапки, после этого выход из основного цикла
|