Привет. Есть ftp сервер, на котором есть файл-описатель, в котором хранится список пар ключ-значение, ключ - название файла xml, значение - его название на русском.
Есть каталог files, в котором располагаются нужные xml.
root
|
+-filelist.json
|
+files (папка)
|
- 1.xml
- 2.xml
...
- n.xml
Клиент сначала с помощью get запроса получает файл filelist.json. после парсинга юзеру отображается окно, в котором он может выбрать нужный файл.
Дальше идет второй запрос get уже с полным путем к файлу.
Так вот, если все файлы на своих местах, все работает.
Если же какой то файл отсюстствует или не найден в папке files, то QNAM возвращает ошибку : couldn't get file size. Правильно.
Но, теперь когда я хочу заново получить список файлов filelist.json (который есть и никуда не девался) я получаю эту ошибку и для этого запроса.
Если файл вернуть на место, все ок. Т.е. ошибка для предыдущего запроса влияет на следующий.
Привожу код:
//запрос filelist.json
void CRemoteConfigurationManager::requestFileList()
{
RemoteConfigurationManagerErorr e = checkUrlParts();
if(e!=noError)
{
emit error(e);
return;
}
static const QString fileListRequestTemplate("ftp://%1:%2@%3/filelist.json");
fcurrentFile.clear();
QUrl url(fileListRequestTemplate.arg(fuser).arg(fpassword).arg(fhost));
QNetworkRequest request(url);
QNetworkReply * reply = fmanager.get(request);
connect(reply,SIGNAL(finished()),this,SLOT(fileListReplyFinished()));
connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError)));
}
//filelist parse
void CRemoteConfigurationManager::fileListReplyFinished()
{
QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender());
Q_ASSERT(reply);
if(reply->error()==QNetworkReply::NoError)
{
QByteArray data = reply->readAll();
QJsonParseError jsonError;
QJsonDocument doc = doc.fromJson(data,&jsonError);
if(jsonError.error==QJsonParseError::NoError)
{
QJsonObject rootObject = doc.object();
QJsonObject filelistObject = rootObject.value("filelist").toObject();
if(!filelistObject.isEmpty())
{
QJsonArray array = filelistObject.value("files").toArray();
QList<CRemoteFileItem> filelist;
foreach (const QJsonValue & jsonValue, array)
{
QJsonObject o = jsonValue.toObject();
if(!o.isEmpty())
{
CRemoteFileItem item;
item.setFileName(o.value("filename").toString());
item.setDescription(o.value("description").toString());
filelist<<item;
}
}
emit fileListReceived(filelist);
}
}
else
{
emit error(fileListParseError);
}
}
reply->deleteLater();
}
//error process
void CRemoteConfigurationManager::processReplyError(QNetworkReply::NetworkError)
{
QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender());
Q_ASSERT(reply);
emit replyError(reply);
reply->deleteLater();
}
//скачка нужного файла
void CRemoteConfigurationManager::getFile(const QString &fileName)
{
RemoteConfigurationManagerErorr e = checkUrlParts();
if(e!=noError)
{
emit error(e);
return;
}
if(fileName.isEmpty())
{
emit error(fileNameIsEmpty);
return;
}
fcurrentFile = fileName;
static const QString fileRequestTemplate("ftp://%1:%2@%3/stations/%4");
QUrl url(fileRequestTemplate.arg(fuser).arg(fpassword).arg(fhost).arg(fileName));
QNetworkRequest request(url);
QNetworkReply * downloadReply = fmanager.get(request);
connect(downloadReply,SIGNAL(finished()),this,SLOT(fileDownloadReplyFinished()));
connect(downloadReply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(processReplyError(QNetworkReply::NetworkError)));
connect(downloadReply,SIGNAL(downloadProgress(qint64,qint64)),this,SIGNAL(fileReceiveProgress(qint64,qint64)));
}