У меня есть программа, в которой у меня есть постоянный путь для каталога FTP. У меня есть функция, которая должна получить доступ к этому каталогу и выполнить некоторые операции с файлами внутри. Раньше в этом каталоге был только один файл, и он всегда имел одно и то же имя, поэтому мне сказали, что можно было бы жестко прописать путь. В этом формате это сработало:
void MyClass::FTPReader()
{
QString filepath = "ftp://user:[email protected]/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...
}
Однако теперь выясняется, что а) в этом каталоге может быть более одного файла, и б) они могут иметь имена переменных. Я знаю, что мне всегда будет нужно все файлы в каталоге, но я не знаю номер или имена. Есть ли способ перебрать каталог ftp (в этом случае needed_directory
и использовать сетевой запрос и ответ, чтобы получить файлы по отдельности? Я думаю, что, вероятно, нужно сделать то же, что и выше, только без специфичной для файла части имени файла, а затем что-то с этим сделать, но я вроде как потерял, как это сделать. Спасибо!
Вы можете использовать QFtp. Для получения списка файлов в каталоге вы можете использовать функцию QFtp :: list. Когда вызывается QFtp :: list, сигнал listInfo посылается один раз для каждой записи каталога. Это можно сделать так:
QFtp ftp;
connect( &ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(ftpListInfo(QUrlInfo)) );
ftp.connectToHost( "ftp://user:[email protected]/needed_directory" );
if( ftp.state() == QFtp::LoggedIn )
ftp.list();
void FtpDialog::ftpListInfo( const QUrlInfo&info )
{
if( info.isFile() )
qDebug() << info.name();
}
Вы могли бы использовать 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:[email protected]/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