QT5之后官方去除了QFtp,但仍可以按照网上的方法自行编译,这里不赘述。
前几日用QFtp自行写了客户端和服务端进行交互,发现客户端调用list()函数的时候,无法获取文件的目录和名字等相关信息,其他的操作,上传下载什么的都正常。
起初以为是服务端代码有问题,于是尝试用 FileZilla 连接,发现连接上后功能一切正常。
上网找了许久未果,直到看到了一个网友的评论。
ChampagneYo :原因是QFtp类里面的parseDir函数的正则表达式与FTP服务器类型不同,需要修改这个类。
于是仔细翻看客户端的QFtp的相关函数,发现果然如此,QFtp并没有实现windows上的正则表达式,如下:
bool QFtpDTP::parseDir(const QByteArray &buffer, const QString &userName, QUrlInfo *info)
{
// Unix style FTP servers
QRegExp unixPattern(QLatin1String("^([\\-dl])([a-zA-Z\\-]{9,9})\\s+\\d+\\s+(\\S*)\\s+"
"(\\S*)\\s+(\\d+)\\s+(\\S+\\s+\\S+\\s+\\S+)\\s+(\\S.*)"));
if (unixPattern.indexIn(bufferStr) == 0) {
_q_parseUnixDir(unixPattern.capturedTexts(), userName, info);
return true;
}
// DOS style FTP servers
QRegExp dosPattern(QLatin1String("^(\\d\\d-\\d\\d-\\d\\d\\d?\\d?\\ \\ \\d\\d:\\d\\d[AP]M)\\s+"
"(<DIR>|\\d+)\\s+(\\S.*)$"));
if (dosPattern.indexIn(bufferStr) == 0) {
_q_parseDosDir(dosPattern.capturedTexts(), userName, info);
return true;
}
return false;
}
这个函数是通过正则表达式,将相对应的数据取出的。
我们可以设计自己的正则表达式,也可以用 QString 的分割截取等操作来实现自己的效果。
具体怎么操作,可以自行打印 buffer 参数,服务端传来的数据都在里面。