【问题标题】:Qt 4.7 - How to iterate through files in an FTP directoryQt 4.7 - 如何遍历 FTP 目录中的文件
【发布时间】:2014-04-14 18:38:38
【问题描述】:

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

void MyClass::FTPReader() { QString filepath = "@987654321@"; QNetworkAccessManager *nam = new QNetworkAccessManager(this); QNetworkRequest request(filepath); QNetworkReply *reply = nam->get(request); //Other operations done on data after this... }

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

【问题讨论】:

    标签: c++ qt qnetworkaccessmanager qtnetwork qftp


    【解决方案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();
    }
    

    【讨论】:

    • 一旦达到连接状态,不要忘记查询列表,即可以在 stateChanged() 处理程序中调用 list() 方法。
    【解决方案2】:

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

    main.cpp

    #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();
    }
    

    main.pro

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

    构建并运行

    qmake-qt4 && (n)make && ./main
    

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2012-10-05
      • 2021-07-09
      • 2014-10-02
      • 2011-12-24
      • 2022-01-02
      相关资源
      最近更新 更多