2

我有一个程序,其中有一个 ftp 目录的恒定路径。我有一个函数需要访问该目录并对其中的文件进行一些操作。以前,这个目录中只有一个文件,而且它总是有相同的名称,所以我被告知可以硬编码路径。在这种格式下,这很有效:

void MyClass::FTPReader() { QString filepath = "ftp://user:password@ftp.myftp.com/needed_directory/needed_file.txt"; QNetworkAccessManager *nam = new QNetworkAccessManager(this); QNetworkRequest request(filepath); QNetworkReply *reply = nam->get(request); //Other operations done on data after this... }

然而,现在事实证明a)这个目录中可以有多个文件,并且b)它们可以有变量名。我知道我总是需要目录中的所有文件,但我不知道编号或名称。有没有办法遍历 ftp 目录(在这种情况下needed_directory,使用网络请求和回复来单独获取文件?我认为它可能需要与上面相同,只是没有文件名的文件特定部分,并且然后用它做点什么,但我有点迷失如何做到这一点。谢谢!

4

2 回答 2

1

您可以使用 QFtp。要检索目录中的文件列表,您可以使用 QFtp::list 函数。当 QFtp::list 被调用时,listInfo 信号会为每个目录条目发出一次。可以这样做:

QFtp ftp;
connect( &ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(ftpListInfo(QUrlInfo)) );
ftp.connectToHost( "ftp://user:password@ftp.myftp.com/needed_directory" );

if( ftp.state() == QFtp::LoggedIn )
  ftp.list();

void FtpDialog::ftpListInfo( const QUrlInfo&info )
{
   if( info.isFile() )
      qDebug() << info.name();
}
于 2014-04-14T19:01:30.330 回答
0

您可以QFtp按如下方式使用该类:

主文件

#include <QFtp>
#include <QDebug>
#include <QCoreApplication>

class MyClass : public QObject
{
    Q_OBJECT
    public:
    MyClass(QObject *parent) : QObject(parent)
    {
        connect(&m_ftp, SIGNAL(listInfo(QUrlInfo)), SLOT(handleListInfo(QUrlInfo)));
        connect(&m_ftp, SIGNAL(stateChanged(int)), SLOT(handleStateChanged(int)));
        m_ftp.connectToHost( "ftp://user:password@ftp.myftp.com/needed_directory" );
        m_ftp.login();
    }

    public slots:
        void handleStateChanged(int state)
        {
            if (state == QFtp::LoggedIn)
                m_ftp.list();
            else
                qDebug() << "Logging in";
        }

        void handleListInfo(const QUrlInfo &info)
        {
           if (info.isFile())
              qDebug() << info.name();
        }

    private:
        QFtp m_ftp;
};

#include "main.moc"

int main(int argc, char **argv)
{
    QCoreApplication coreApplication(argc, argv);
    return coreApplication.exec();
}

主程序

TEMPLATE = app
TARGET = main
QT = core network
SOURCES += main.cpp

构建并运行

qmake-qt4 && (n)make && ./main
于 2014-04-14T22:00:04.597 回答