Russian Qt Forum

Qt => Работа с сетью => Тема начата: dread от Апрель 25, 2007, 09:06



Название: QFTP
Отправлено: dread от Апрель 25, 2007, 09:06
Подскажите наиболее простой способ при помощи QFtp скачать файлы из папки по масске в каталог на диске - и совершить обратную операцию...

ftp->connectToHost(ftp_HOST,ftp_PORT);
ftp->login(ftp_NAME,ftp_PASSWORD);

далее чере ->list() ? и сигнал listInfo ?

а при записи? ->put() ?

если подкините примерчик работы с чтением / записью файлов  на QFTP буду очень благодарен.

Понимаю что вопрос наверное немного ламерский, просто не могу сам разобраться в этом классе....

добавлено спустя 2 часа 38 минут:

 Вроде разобрался... остался только один вопрос:
как организовать передачу многих файлов?
открываем - передаем - закрываем - открываем следующий?... повторить?

добавлено спустя 1 час:

 в чем может быть проблема?

пытаюсь скопировать файл на фтп сервер

на сигнале завершения команды пут ловлю еррор с кодом 1 ???

добавлено спустя 29 минут:

    ftp1->connectToHost(ftp_HOST,ftp_PORT);
   ftp1->login(ftp_NAME,ftp_PASSWORD);   
   ftp1->cd("..");
   //ftp1->list();
   QFile file("D:\\test.txt");
   file.open(QIODevice::ReadOnly | QIODevice::Unbuffered);
   ftp1->put( &file , "test.txt" );
   ftp1->close();

на выполнение этого кода получаю ошибку (на комманде put):
отсылает к этой строче класса qFTP:
 if (c->data.dev->isSequential())

что он хочет этим сказать?
почему я не могу произвести операцию записи???

добавлено спустя 43 минуты:

 почему команда put только создает пустой файл - затем рвет соединение?
сообщая о том что мол все ок ?

добавлено спустя 14 минут:

 ftp1->connectToHost(ftp_HOST,ftp_PORT);
ftp1->login(ftp_NAME,ftp_PASSWORD);   
ftp1->setTransferMode(QFtp::Passive);
file = new QFile("D:\\test.jpg");
ftp1->rawCommand("STOR D:\\test.jpg");
//file->open(QIODevice::ReadOnly);
//ftp1->put( file , "nikola.jpg" );
//ftp1->get( "Ten.jpg" , file );
ftp1->close();

в чем возможня ошибка? почему чтение работает безупречно, в то время как запись на сервер создает пустой файл и рвет соединение... файл открыт для чтения... что может быть причиной такого поведения???


Название: QFTP
Отправлено: dread от Апрель 26, 2007, 04:55
Неужели никто не работал с QFTP на закачку?


Название: QFTP
Отправлено: dread от Апрель 27, 2007, 05:37
Разобрался сам, если кому интересно, пишите мне


Название: Re: QFTP
Отправлено: BlackLagarto от Апрель 08, 2009, 23:29
Интересно послушать решение которое вы нашли...

Насколько я понимаю если я хочу залить на сервак кучу файлов то прежде чем послать следующий файл мне надо отследить загрузился ли предыдущий.

Как это в коде реализовать или я в корне не прав?


Название: Re: QFTP
Отправлено: xintrea от Апрель 10, 2009, 17:25
Интересно послушать решение которое вы нашли...

Насколько я понимаю если я хочу залить на сервак кучу файлов то прежде чем послать следующий файл мне надо отследить загрузился ли предыдущий.

Как это в коде реализовать или я в корне не прав?

Тоже хочу это узнать


Название: Re: QFTP
Отправлено: roginovicci от Апрель 27, 2009, 11:39
И я.
Хотя примерно понятно. Надо отлавливать сигналы, а саму загрузку запускать из нового треда. Поправте меня если я не прав.


Название: Re: QFTP
Отправлено: BlackLagarto от Май 02, 2009, 20:06
Алгоритм примерно следующий

1.Создаем очередь из файлов которые хотим закинуть на Фтп (ftp.put();)
2.Проверяем зугрузился ли файл
3.Кидаем следующий


Название: Re: QFTP
Отправлено: PunX от Июнь 05, 2009, 20:02
День добрый, столкнулся с проблемоя при копировании файлов на фтп
Код:
 void FtpWindow::uploadFile() {
       QString fileName = QFileDialog::getOpenFileName(this);
       QFileInfo  fi(fileName);
       QFile *upfile = new QFile(fileName);
       upfile->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
       ftp->put(upfile, fi.fileName());
       connect(upfile, SIGNAL(done(bool)), this, SLOT(close()));
       upfile->close();
       progressDialog->setLabelText(tr("uploading %1...").arg(fi.fileName()));
       uploadButton->setEnabled(false);
       progressDialog->exec();}
но файл не копируется вообще, прогресс бар зависает на 0% и всё!


Название: Re: QFTP
Отправлено: Krow от Июнь 08, 2009, 19:17
мне тоже интересно. как правильно закачать файл?? или никто не знает??
попытался экзамплы посмотреть... нифига оттуда не понял.


Название: Re: QFTP
Отправлено: ритт от Июнь 08, 2009, 19:32
Код:
       connect(upfile, SIGNAL(done(bool)), this, SLOT(close()));
//       upfile->close();
       ftp->put(upfile, fi.fileName());
и ещё неплохо было бы соединить сигнал о прогрессе передачи фтп со слотом прогресса прогрессдиалога...


Название: Re: QFTP
Отправлено: Krow от Июнь 10, 2009, 08:46
Код:
	ftp.abort();
ftp.connectToHost(host, 21);
ftp.login(login, passwd);
QFile *fileOut = new QFile("prays.cs");
ftp.cd(dir);
ftp.put(fileOut, fileOut->fileName());
ftp.close();
вот мой код загрузки файла.. но фтп соединение рвется раньше чем я завершу загрузку файла.. где у меня тут ошибка?? и как вообще отслеживается выполнение загрузки?? подскажите, а?


Название: Re: QFTP
Отправлено: BRE от Июнь 10, 2009, 09:18
Код:
        ...
ftp.close(); // !!!
вот мой код загрузки файла.. но фтп соединение рвется раньше чем я завершу загрузку файла.. где у меня тут ошибка?? и как вообще отслеживается выполнение загрузки?? подскажите, а?
Не нужно ничего закрывать сразу! Обмен идет асинхронно, команда put и get только запускают этот процесс.
Все состояния сообщаются клиенту через сигналы. По моему, из названий сигналов и так все ясно.  ;)


Название: Re: QFTP
Отправлено: ритт от Июнь 10, 2009, 09:30
мля, я для кого close закомментировал?!


Название: Re: QFTP
Отправлено: Krow от Июнь 10, 2009, 09:40
я уже удалил закрытие из той части кода
dataTransferProgress() или commandFinished(). какой из этих сигналов нужно использовать? думаю что второй.. тока вот вопрос как его правильно пользовать???


Название: Re: QFTP
Отправлено: Krow от Июнь 10, 2009, 13:30
попробовал сделать как у PunX.. проблема та же.. логинится. создает файл новый.. и фсё... и тишина..
Код:
	ftp.abort();
ftp.connectToHost(host, 21);
//lwConn->addItem(tr("Соединяюсь с сервером. Логин - %1").arg(login));
ftp.login(login, passwd);
QFile *fileOut = new QFile("prays.cs");
QFileInfo  fi("prays.cs");
ftp.cd(dir);
fileOut->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
ftp.put(fileOut, fi.fileName());
progressDialog->setLabelText(tr("Загрузка %1...").arg(fi.fileName()));
    progressDialog->exec();
и где тут ошибка??
Константин... я щас не так часто обращаюсь за помощью, только то что действительно не знаю.. или не могу разобраться. был бы признателен если бы не ругались. не всё дается сразу


Название: Re: QFTP
Отправлено: BRE от Июнь 10, 2009, 13:41
попробовал сделать как у PunX.. проблема та же.. логинится. создает файл новый.. и фсё... и тишина..
Приконнектся к сигналам commandStarted, commandFinished и посмотри какие команды выполняются, проверяй состояние (сигнал stateChaged) и ошибки. Тогда поймешь в каком месте и по какой причине прерывается операция.

P.S. И еще добавь проверку при открытии файла prays.cs, что-то мне подсказывает, что не открывается он...


Название: Re: QFTP
Отправлено: Krow от Июнь 12, 2009, 06:41
спасиб, BRE. действительно файл просто не открывался. щас всё заработало!


Название: Re: QFTP
Отправлено: n. tr. от Июль 02, 2009, 11:30
Здравствуйте!
Есть очень простая задача - скачать с фтп файл.
Делаю всё простым образом:
Код
C++ (Qt)
QFile *file = new QFile("out.txt");
if (!file->open(QIODevice::WriteOnly))
return -1;
ftp = new QFtp(this);
ftp->connectToHost("ftp.trolltech.com");
ftp->login();                            
ftp->cd("qt");              
ftp->get("INSTALL", file);            
ftp->close();  
file->close();
 
return 0;


На выходе мой файл - пустой. Что я делаю не так?


Название: Re: QFTP
Отправлено: n. tr. от Июль 02, 2009, 11:53
Проблему вроде решил (не знаю, правильно ли).
Всё из-за того, что соединение происходит не мгновенно, поэтому файл закрывался раньше, чем заканчивала работу команда get.


Название: Re: QFTP
Отправлено: n. tr. от Июль 27, 2009, 13:06
ещё вопрос по сабжу.
у меня все сигналы commandFinished и commandStarted соеденены с соотв. слотом, самое интересное, что слот запускается только при командах set the transfer mode  switch proxying on or off is working
switch proxying, connectToHost() и login(), а мне очень нужно завершение команды list. Но не выходит.
Кто-нибудь сталкивался?


Название: Re: QFTP
Отправлено: niXman от Июль 27, 2009, 15:12
Ну вы что, документацию не читаете?

1. логинимся.
2. открываем отправляемый файл.
3. отправляем.
4. ждем испускания сигнала "void commandFinished ( int id, bool error )"
5. Закрываем файл.

это наскоро набросанный алгоритм. А правильный - нужно запоминать "id" каждой команды, посланной в QFtp. А знать его можно подключив к сигналу "QFtp::commandStarted ( int id )" слот.

В примерах($(QTDIR)/examples/network/ftp) приведен исчерпывающий пример.

Успехов.


Название: Re: QFTP
Отправлено: n. tr. от Июль 28, 2009, 14:29
документацию я прочитал. Проблема в том, что сигнал то ли не испускается, то ли не отлавливается. Кроме указанных, других сигналов нет, хотя команды, выполняются.
Мне нужна скачка файлов по шаблону, но выяснилось, что если какого-то из фалов нету, то не сумев его скачать функцией get() работа Qftp завершается. Варианта два: либо создавать новый объект QFtp для каждого файла, либо проверять наличие файлов в listInfo и редактировать шаблон.
далее я думал, что в слот, соединённый с сигналом сommandFinished я помещу вызов функции скачки, если id будет равен QFtp::List. В итоге - фига. Лист завершается, а слот не вызывается не фига!!!
Пришлось помещать скачку прямо в listInfo (и выглядит это кривовато, честно говоря).



Кстати, niXman похоже не по моей проблеме высказался, ну ладно, не суть, там тоже ошибка. Закрывать нужно после сигнала done, а не commandFinished, потому что возможна ситуация как у меня, когда сигнал испущен не будет - для того же get у меня сигнал почему-то не испускается (ни commandStarted ни commandFinished).

QT 4.4.3.


Название: Re: QFTP
Отправлено: Vexator от Август 21, 2009, 04:17
Код
C++ (Qt)
this->setGeometry( QRect(20, 20, 200, 50) );
setWindowTitle("FTP downloader v 1.1");
 
ftp = new QFtp(this);
connect(ftp, SIGNAL(commandFinished(int, bool)),this, SLOT(ftpCommandFinished(int, bool)));
connect(ftp, SIGNAL(listInfo(const QUrlInfo &)),this, SLOT(addToList(const QUrlInfo &)));  //тут выполняеться создание списка файлов для скачки
connect(ftp, SIGNAL(commandStarted(int )),this,SLOT(ftpMod(int )));
 
   
прекрасно работает...
просматриваем каталог, листим, формируем лист файлов для скачки (по заданному шаблону), качаем.. никогда проблем не было...

Qt 4.2.3