ΠΠ»Π°ΡΡ QFtp ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ FTPβΠΊΠΎΠΌΠ°Π½Π΄, Π²ΠΊΠ»ΡΡΠ°Ρ connectToHost(), login(), close(), list(), cd(), get(), put(), remove(), mkdir(), rmdir() ΠΈ rename(). ΠΡΠ΅ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΊΠ°ΠΊΡΡ-ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ FTP ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠΈΡΠ»ΠΎ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΡΡΠ΅Π΅ ΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊΠΆΠ΅ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ°ΡΡΠΈΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ°) ΠΈ ΡΠΈΠΏΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ (Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ).
ΠΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ FTP ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ rawCommand(). ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΏΡΠΈΠΌΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ SITE CHMOD:
ftp.rawCommand("SITE CHMOD 755 fortune");
QFtp Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π» commandStarted(int) Π² Π½Π°ΡΠ°Π»Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈ ΡΠΈΠ³Π½Π°Π» commandFinished(int, bool) ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠΈΠΏΠ° int ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΡΠ»ΠΎΠΌ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΡΠ»ΠΈ ΠΌΡ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΡΡΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΏΡΠΈ ΠΏΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΡΡ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΠ²ΡΠ·Ρ Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
01 bool FtpGet::getFile(const QUrl &url)
02 {
03 β¦
04 connectId = ftp.connectToHost(url.host(), url.port(21));
05 loginId = ftp.login();
06 getId = ftp.get(url.path(), &file);
07 closeId = ftp.close();
08 return true;
09 }
10 void FtpGet::ftpCommandStarted(int id)
11 {
12 if (id == connectId) {
13 ΡΠ΅Π³Π³ << "Connecting..." << endl;
14 } else if (id == loginId) {
15 cerr << "Logging in..." << endl;
16 β¦
17 }
ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠ²ΡΠ·ΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΊ ΡΠΈΠ³Π½Π°Π»Ρ stateChanged() ΠΊΠ»Π°ΡΡΠ° QFtp, ΠΊΠΎΡΠΎΡΡΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΏΡΠΈ Π²ΡΡΠΊΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ (QFtp::Connecting, QFtp::Connected, QFtp::LoggedIn ΠΈ Ρ.Π΄.).
Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄, Π° Π½Π΅ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄. Π ΡΠ°ΠΊΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠΈΠ³Π½Π°Π» done(bool), ΠΊΠΎΡΠΎΡΡΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π²ΡΡΠΊΠΈΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΊΠΎΠΌΠ°Π½Π΄ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΏΡΡΡΠΎΠΉ.
ΠΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ QFtp Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΈΡΠ°Π΅Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΊΠΎΠΌΠ°Π½Π΄. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ Π²Ρ ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΡΠΈΡΡΠ΅ΠΌΡ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ. ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΡΠ»Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π·Π°Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° QFtp, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Ρ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ.
Π ΡΠ°ΠΉΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ .pro Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ QtNetwork:
QT += network
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ ΠΏΡΠΈΠΌΠ΅Ρ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ spider (ΠΏΠ°ΡΠΊ) ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ FTPβΡΠ΅ΡΠ²Π΅ΡΠ°, ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³. ΠΡΡ Π»ΠΎΠ³ΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΡ Ρ ΡΠ΅ΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π² ΠΊΠ»Π°ΡΡΠ΅ Spider:
01 class Spider : public QObject
02 {
03 Q_OBJECT
04 public:
05 Spider(QObject *parent = 0);
06 bool getDirectory(const QUrl &url);
07 signals:
08 void done();
09 private slots:
10 void ftpDone(bool error);
11 void ftpListInfo(const QUrlInfo &urlInfo);
12 private:
13 void processNextDirectory();
14 QFtp ftp;
15 QList<QFile *> openedFiles;
16 QString currentDir;
17 QString currentLocalDir;
18 QStringList pendingDirs;
19 };
ΠΠ°ΡΠ°Π»ΡΠ½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΈΠΏΠ° QUrl ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ getDirectory().
01 Spider::Spider(QObject *parent)
02 : QObject(parent)
03 {
04 connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
05 connect(&ftp, SIGNAL(listInfo(const QUrlInfo &)),
06 this, SLOT(ftpListInfo(const QUrlInfo &)));
07 }
Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π΄Π²Π° ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠΈΠ³Π½Π°Π»βΡΠ»ΠΎΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π²ΡΠ΄Π°Π΅ΠΌ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π² getDirectory(), QFtp Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π» listInfo(const QUrlInfo &) Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠΡΠΎΡ ΡΠΈΠ³Π½Π°Π» ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΊ ΡΠ»ΠΎΡΡ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ftpListInfo(), ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΉΠ» ΠΈΠ· ΡΠ΅ΡΠΈ ΠΏΠΎ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡ Π°Π΄ΡΠ΅ΡΡ URL.
01 bool Spider::getDirectory(const QUrl &url)
02 {
03 if (!url.isValid()) {
04 cerr << "Error: Invalid URL" << endl;
05 return false;
06 }
07 if (url.scheme() != "ftp") {
08 cerr << "Error: URL must start with 'ftp:'" << endl;
09 return false;
10 }
11 ftp.connectToHost(url.host(), url.port(21));
12 ftp.login();
13 QString path = url.path();
14 if (path.isEmpty())
15 path = "/";
16 pendingDirs.append(path);
17 processNextDirectory();
18 return true;
19 }
ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ getDirectory() Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ, ΠΈ Π΅ΡΠ»ΠΈ Π²ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, Π΄Π΅Π»Π°Π΅ΡΡΡ ΠΏΠΎΠΏΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ FTPβΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ½Π° ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ, ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ processNextDirectory(), ΡΡΠΎΠ±Ρ Π½Π°ΡΠ°ΡΡ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠ½Π΅Π²ΠΎΠ³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π°.
01 void Spider::processNextDirectory()
02 {
03 if (!pendingDirs.isEmpty()) {
04 currentDir = pendingDirs.takeFirst();
05 currentLocalDir = "downloads/" + currentDir;
06 QDir(".").mkpath(currentLocalDir);
07 ftp.cd(currentDir);
08 ftp.list();
09 } else {
10 emit done();
11 }
12 }
Π€ΡΠ½ΠΊΡΠΈΡ processNextDirectory() ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ, pendingDirs, ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ½Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ QFtp Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π½Π° ΠΏΡΠΈΠ½ΡΡΡΠΉ Π΅Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π΅Π³ΠΎ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ list(), Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠΈΠ³Π½Π°Π» listInfo(), ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΠΈΠΉ ΠΊ Π²ΡΠ·ΠΎΠ²Ρ ΡΠ»ΠΎΡΠ° ftpListInfo().
ΠΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½Π½ΡΠΌΠΈ, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΈΠ³Π½Π°Π» done(), ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡΠΈΠΉ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΡ.
01 void Spider::ftpListInfo(const QUrlInfo &urlInfo)
02 {
03 if (urlInfo.isFile()) {
04 if (urlInfo.isReadable()) {
05 QFile *file = new QFile(currentLocalDir + "/"
06 + urlInfo.name());
07 if (!file->open(QIODevice::WriteOnly)) {
08 cerr << "Warning: Cannot open file << qPrintable(
09 QDir::convertSeparators(file->fileName()))
10 << endl;
11 return;
12 }
13 ftp.get(urlInfo.name(), file);
14 openedFiles.append(file);
15 }
16 } else if (urlInfo.isDir() && !urlInfo.isSymLink()) {
17 pendingDirs.append(currentDir + "/" + urlInfo.name());
18 }
19 }
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ urlInfo ΡΠ»ΠΎΡΠ° ftpListInfo() ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ°ΠΉΠ»Π΅ Π² ΡΠ΅ΡΠΈ. ΠΡΠ»ΠΈ ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» (Π½Π΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³) ΠΈ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ get() Π΄Π»Ρ Π΅Π³ΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠΈ. ΠΠ±ΡΠ΅ΠΊΡ QFile, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠ°ΠΉΠ»Π°, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° new, ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅Π³ΠΎ Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ openedFiles.
ΠΡΠ»ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠ΅ΡΡ Π² QUrlInfo ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠ± ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ Π³ΠΎΠ²ΠΎΡΡΡ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ²ΡΠ·ΡΡ, ΡΡΠΎΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ ΠΊ ΡΠΏΠΈΡΠΊΡ pendingDirs. ΠΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ²ΡΠ·ΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠ΅ΠΊΡΡΡΠΈΠΈ.
01 void Spider::ftpDone(bool error)
02 {
03 if (error) {
04 cerr << "Error: " << qPrintable(ftp.errorString()) << endl;
05 } else {
06 cout << "Downloaded " << qPrintable(currentDir) << " to "
07 << qPrintable(QDir::convertSeparators(
08 QDir(currentLocalDir).canonicalPath()));
09 }
10 qDeleteAll(openedFiles);
11 openedFiles.clear();
12 processNextDirectory();
13 }
Π‘Π»ΠΎΡ ftpDone() Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π²ΡΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄ FTP ΠΈΠ»ΠΈ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡ ΡΠ΄Π°Π»ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΡ QFile Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΡΠ΅ΡΠ΅ΠΊ ΠΏΠ°ΠΌΡΡΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ Π·Π°ΠΊΡΡΡΠΈΡ Π²ΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ processNextDirectory(). ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡΠ΄Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΎΡΡΠ°Π»ΠΈΡΡ, Π²Π΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π² ΡΠΏΠΈΡΠΊΠ΅; Π² ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠΈΠ³Π½Π°Π» done().
ΠΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅Ρ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ FTP ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ² Π±ΡΠ΄Π΅Ρ ΡΠ°ΠΊΠΎΠΉ:
connectToHost(host, port)
login()
cd(directory_1)
list()
emit listInfo(file_1_1)
get(file_1_1)
emit listInfo(file_1_2)
get(file_1_2)
β¦
emit done()
β¦
cd(directory_N)
list()
emit listInfo(file_N_1)
get(file_N_1)
emit listInfo(file_N_2)
get(file_N_2)