Название: Рекурсия ftp, уходит за директорию Отправлено: B_u_R_n от Апрель 28, 2010, 13:14 Здравствуйте.
Такая проблема, взял кусок кода из экзамплов с книги Закачка рекурсивная работает, только если я начинаю к примеру скачивать директорию с фтп сервера по путям ftp://127.0.0.1/ftp/tmp/hello/ Прога выкачивает все что есть в hello переходит на диру выше, т.е. на ftp://127.0.0.1/ftp/tmp/ и качает от туда все так же рекурсивно Вот код Обработчик на кнопку аплоад void FtpWindow::Download_Dir() { QUrl url(ftpServerLineEdit->text()); ftp1->connectToHost(url.host(), 21); ftp1->login(); if(!ftp) { QMessageBox msgBox; msgBox.setText("Not connect"); msgBox.exec(); } else { flag=1; if(s1=='\0') { QMessageBox msgBox; msgBox.setText("Change dir."); msgBox.exec(); } else { QString f=ftpServerLineEdit->text(); int i=0; int p=0; QString sd=currentPath; QString g=fileList->currentItem()->text(0); while(f!='\0') i++; if(f[i-1]=='/') { while(sd[p]!='\0') f[i-1]=sd[p],p++,i++; } f=f+'/'; f=f+g; qDebug()<<f; getDirectory(QUrl(f)); } } } s1 это полный путь до файла/диры которую пользователь выбрал в меню QTreeWidget bool FtpWindow::getDirectory(const QUrl &url) { if (!url.isValid()) { qDebug()<< "Error: Invalid URL" << endl; return false; } if (url.scheme() != "ftp") { qDebug()<< "Error: URL must start with 'ftp:'" << endl; return false; } QString path = url.path(); qDebug()<<path; if (path.isEmpty()) path = "/"; pendingDirs.append(path); processNextDirectory(); return true; } void FtpWindow::processNextDirectory() { if (!pendingDirs.isEmpty()) { currentDir = pendingDirs.takeFirst(); currentLocalDir = "Donwload/"+currentDir; QDir(".").mkpath(currentLocalDir); ftp1->cd(currentDir); ftp1->list(); } else { emit done(); } } Обработчик на дон void FtpWindow::ftpDone(bool error) { if (error) { qDebug() << "Error: " << qPrintable(ftp1->errorString()) << endl; } else { flag=0; qDebug()<< "Downloaded " << qPrintable(currentDir) << " to " << qPrintable(QDir::convertSeparators( QDir(currentLocalDir).canonicalPath())); } qDeleteAll(openedFiles); openedFiles.clear(); processNextDirectory(); } Обработчик на получение файлов void FtpWindow::ftpListInfo(const QUrlInfo &urlInfo) { if (urlInfo.isFile()) { if (urlInfo.isReadable()) { QFile *file = new QFile(currentLocalDir + "/" + urlInfo.name()); if (!file->open(QIODevice::WriteOnly)) { qDebug() << "Warning: Cannot open file " << qPrintable( QDir::convertSeparators(file->fileName())) << endl; return; } ftp1->get(urlInfo.name(), file); openedFiles.append(file); } } else if (urlInfo.isDir() && !urlInfo.isSymLink()) { pendingDirs.append(currentDir + "/" + urlInfo.name()); } } Вот эти функции, сами обработчики connect(ftp1, SIGNAL(done(bool)), this, SLOT(ftpDone(bool))); connect(ftp1, SIGNAL(listInfo(QUrlInfo)),this, SLOT(ftpListInfo(const QUrlInfo &))); Помогите пожалуйста, как поправить... |