基于QT的FTP客户端
Qt5.0以后,将QFtp移除了,推荐使用QNetworkAccessManager。
根据官方的建议使用QNetworkAccessManager进行开发,实现Ftp的上传和下载功能,但当先要实现获取文件列表显示时,却发现有些原本QFtp有的功能,QNetworkAccessManager却没有提供,如获取远程FTP服务器列表功能list(),新建文件夹mkdir()等功能。(更多区别请查看QFtp Class Reference与QNetworkAccessManager Class)。
于是,只能自己找资料了,经搜索发现,可以使用QFtp但要自行编译,且QFtp的代码一直在维护。
编译QFtp
既然QFtp可以使用,且代码也在维护,便决定自行编译一个。
- 下载QtFtp源码:https://qt.gitorious.org/qt/qtftp
- 将下载到的文件解压(我将其解压到了
F:\Project中) - 进入
F:\Project\qt-qtftp\src\qftp打开qftp.pro将文件中CONFIG -= shared修改为CONFIG += shared,使编译能生成动态库。还需要将qftp.h中的#include <QtFtp/qurlinfo.h>修改为#include <qurlinfo.h>,否则会出现:In file included from qftp.cpp:45:0:qftp.h:47:28: fatal error: QtFtp/qurlinfo.h: No such file or directory#include <QtFtp/qurlinfo.h> - 在开始菜单打开Qt命令行,cd到
F:\Project\qt-qtftp\src\qftp,执行qmake,再执行mingw32-make
- 进入
F:\Project\qt-qtftp\lib将生成的*.dll文件复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\bin目录(我的Qt装在E盘),将*.a和*.pri文件复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\lib目录 - 进入
F:\Project\qt-qtftp\src\qftp将qftp.h和qurlinfo.h复制到E:\Qt\Qt5.2.1\5.2.1\mingw48_32\include\QtNetwork目录,并新建无后缀名的文件QFtp(可以新建文本文档,再将后缀去除),在QFtp文件中写入一行代码#include "qftp.h"
用msvc版qt编译补充:
1.修改qftp.pro文件
-
CONFIG += static -
CONFIG -= shared
改为
-
CONFIG += staticlib -
CONFIG += shared
这样可以生成*.lib文件。
2.用vs编译器nmake时,会出现
-
f:\project\qt\qttftp\src\qftp\qftp.h(47) : fatal error C1083: 无法打开包括文件: -
“qurlinfo.h”: No such file or directory
这其中qftp.h不能使用#include <qrulinfo.h>,需改用冒号形式#include "qrulinfo.h"
编译完成,可以使用QFtp啦。。。
使用QFtp
具体使用请参考:FTP Example或查看下载的源代码F:\Project\qt-qtftp\examples\qftp。
在编译源代码的例子前,需要将ftpwindow.cpp中的#include <QtFtp>改为#include <QFtp>,因为我们上面新建的是名为QFtp无后缀名文件。
修改完后,在Qt命令行cd到F:\Project\qt-qtftp\examples\qftp,执行qmake,再执行mingw32-make,即可完成编译。打开F:\Project\qt-qtftp\examples\qftp\release中的qftp.ext即可查看编译后的效果。
解决文件列表中文乱码问题
由于FTP对编码是一无所知的,所以当遇到中文时,就会出现乱码情况。
←_← shenmogui
为解决显示乱码问题,我们需要一个函数:
-
_FromSpecialEncoding(const QString &InputStr) -
{ -
#ifdef Q_OS_WIN -
return QString::fromLocal8Bit(InputStr.toLatin1()); -
#else -
QTextCodec *codec = QTextCodec::codecForName("gbk"); -
if (codec) -
{ -
return codec->toUnicode(InputStr.toLatin1()); -
} -
else -
{ -
return QString(""); -
} -
#endif -
}
并修改例子ftpwindow.cpp文件void FtpWindow::addToList(const QUrlInfo &urlInfo)函数中的代码,将
item->setText(0, urlInfo.name());
改为
item->setText(0, _FromSpecialEncoding(urlInfo.name()));
就可以显示中文啦↓↓↓

文件名是正常了,但是下载不了中文名字的文件了。。。←_←
这时就需要另一个函数出场了
-
_ToSpecialEncoding(const QString &InputStr) -
{ -
#ifdef Q_OS_WIN -
return QString::fromLatin1(InputStr.toLocal8Bit()); -
#else -
QTextCodec *codec= QTextCodec::codecForName("gbk"); -
if (codec) -
{ -
return QString::fromLatin1(codec->fromUnicode(InputStr)); -
} -
else -
{ -
return QString(""); -
} -
#endif -
}
修改例子ftpwindow.cpp文件void FtpWindow::downloadFile()函数中的代码,将
ftp->get(fileList->currentItem()->text(0), file);
改为
ftp->get(_ToSpecialEncoding(fileList->currentItem()->text(0)), file);
OK!这样就可以显示并下载中文文件名的文件
573

被折叠的 条评论
为什么被折叠?



