A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

基于QT的FTP客户端

Qt5.0以后,将QFtp移除了,推荐使用QNetworkAccessManager。
根据官方的建议使用QNetworkAccessManager进行开发,实现Ftp的上传和下载功能,但当先要实现获取文件列表显示时,却发现有些原本QFtp有的功能,QNetworkAccessManager却没有提供,如获取远程FTP服务器列表功能list(),新建文件夹mkdir()等功能。(更多区别请查看QFtp Class ReferenceQNetworkAccessManager 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!这样就可以显示并下载中文文件名的文件


1 个回复

倒序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马