我有一个程序,其中我有一个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
并使用网络请求和回复来单独获取文件?我认为它可能需要像上面那样做,只是没有文件特定的文件名的一部分,然后用它做一些事情,但我有点失去了怎么做。谢谢!
答案 0 :(得分: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();
}
答案 1 :(得分: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