基本信息
源码名称:FTP客户端实例源码(基于QT)
源码大小:15.61M
文件格式:.rar
开发语言:C/C++
更新时间:2019-04-21
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
实现的ftp客户端,能列出/更改目录,上下传文件,显示文件列表等选项。
基于QT的FTP客户端
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextCodec>
#include <QMouseEvent>
#include <QPoint>
#include <QButtonGroup>
#include <QMenu>
#include <QHeaderView>
#include "qftp.h"
#include <QInputDialog>
#include <QMessageBox>
#include <QDebug>
#include <QFileDialog>
#include <QHeaderView>
#include <QAction>
#include <QPalette>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
initform();
setContextMenuPolicy(Qt::DefaultContextMenu);//
}
MainWindow::~MainWindow()
{
delete ui;
}
//初始化窗口
void MainWindow::initform()
{
ftp = new QFtp();
ui->progressBar->setValue(0);
ui->lineEdit->setText("192.168.0.108");
ui->lineEdit_2->setText("Angelzhx");
ui->lineEdit_3->setText("123456");
ui->lineEdit_4->setText("D:/");
ftp->setTransferMode(QFtp::Active);
// ftp->setTransferMode(QFtp::Passive); beidong
connect(ftp,SIGNAL(commandStarted(int)),this,SLOT(ftpCommandStarted(int)));
connect(ui->treeWidget,SIGNAL(itemActivated(QTreeWidgetItem*,int)),
this,SLOT(processItem(QTreeWidgetItem*,int)));
this->setFixedSize(this->size());
connect(ftp,SIGNAL(dataTransferProgress(qint64,qint64)),this,SLOT(updateDataTransferProgress(qint64,qint64)));
connect(ftp,SIGNAL(listInfo(QUrlInfo)),this,SLOT(addToList(QUrlInfo)));
connect(ftp,SIGNAL(commandFinished(int,bool)),this,SLOT(ftpCommandFinished(int,bool)));
connect(ftp,SIGNAL(stateChanged(int)),this,SLOT(ftpStateChanged(int)));
}
//登陆服务器
void MainWindow::on_pushButton_clicked()
{
if(ui->pushButton->text() == "注销")
{
ftp->close();
ui->pushButton->setText(tr("connect"));
ui->treeWidget->clear();
currentPath.clear();
isDirectory.clear();
}
else if(ui->pushButton->text() == "connect")
{
ui->treeWidget->clear();
currentPath.clear();
isDirectory.clear();
QString ip=ui->lineEdit->text();
QString username=ui->lineEdit_2->text();
QString pwd=ui->lineEdit_3->text();
ftp->connectToHost(ip, 21);
ftp->login(username, pwd);
}
}
//解决中文乱码问题
QString MainWindow::toSpecialEncoding(const QString &inputStr)
{
QTextCodec *codec= QTextCodec::codecForName("gbk");
if (codec)
{
return QString::fromLatin1(codec->fromUnicode(inputStr));
}
else
{
return QString("");
}
}
//文件列表信息输入到表格
void MainWindow::addToList(const QUrlInfo &urlInfo)
{
QString fileSize; //用于存储文件大小,根据文件大小字节,设置文件在树列表的单位
if(urlInfo.size() >=0 && urlInfo.size() < 1024)
{
fileSize = QString::number(urlInfo.size()) "Byte";
}
else if(urlInfo.size() >= 1024 && urlInfo.size() < 1024*1024)
{
fileSize = QString::number(urlInfo.size()/1024.0,'f',2) "KB";
}
else if(urlInfo.size() >= 1024*1024 && urlInfo.size() < 1024*1024*1024)
{
fileSize = QString::number(urlInfo.size()/1024/1024.0,'f',2) "MB";
}
else if(urlInfo.size() >= 1024*1024*1024)
{
fileSize = QString::number(urlInfo.size()/1024/1024/1024.0,'f',2) "GB";
}
//添加文件各信息到树列表
QTreeWidgetItem *item = new QTreeWidgetItem;
//转换UrlInfo中的文件名编码,解决乱码
item->setText(0, urlInfo.name());
item->setText(1, fileSize);
item->setText(2, urlInfo.lastModified().toString("yyyy/MM/dd hh:mm"));
// item->setText(3, urlInfo.owner());
// item->setText(4, urlInfo.group());
//显示文件和文件夹图标
QPixmap pixmap(urlInfo.isDir() ? ":/1111/dir.png" : ":/1111/file.png");
item->setIcon(0, pixmap);
//存储该路径是否为目录的信息
isDirectory[urlInfo.name()] = urlInfo.isDir();
ui->treeWidget->addTopLevelItem(item);
if (!ui->treeWidget->currentItem())
{
ui->treeWidget->setCurrentItem(ui->treeWidget->topLevelItem(0));
ui->treeWidget->setEnabled(true);
}
}
//上传文件
void MainWindow::on_pushButton_2_clicked()
{
QString filePath = QFileDialog::getOpenFileName(this,
tr("打开文件"),
"./",
tr("All Files (*);"));
if(filePath.isEmpty())
return;
//打开文件
QFile *file = new QFile(filePath);//
if(!file->open(QIODevice::ReadWrite))
{
delete file;
file = NULL;
ui->textEdit->append(tr("本地文件:%1打开失败!").arg(file->fileName()));
return;
}
QFileInfo fileinfo(filePath);
fileName = fileinfo.fileName();
QMessageBox::information(this,"information","Are you sure download :" fileName);
//转换上传的文件名编码,解决上传带有中文文件名的文件出错的问题,开始上传
ftp->put(file,toSpecialEncoding( fileName));
ui->textEdit->append(tr("正在上传:%1......").arg(fileName));
}
/***************下载文件*****************/
void MainWindow::on_pushButton_3_clicked()
{
//判断当前储存路径是否为空
if(ui->lineEdit_4->text().isEmpty())
{
openSaveFilePath();
return;
}
QString name = ui->treeWidget->currentItem()->text(0);
QString str = toSpecialEncoding(name);
if (isDirectory.value(str)) //如果选中的是目录,则返回
{
return;
}
else
{
downloadFile(name);
}
}
void MainWindow::downloadFile(const QString &fileName)
{
//获取当前树列表中选中的文件名,并加上保存路径
serverFileName = fileName;
savePath=ui->lineEdit_4->text();
QString filepath;
if(serverFileName==NULL)
filepath = savePath;
else
filepath = savePath "/" serverFileName;
file = new QFile(filepath);
QMessageBox::information(this,"information","Are you sure download :" fileName);
if (!file->open(QIODevice::WriteOnly))
{
delete file;
ui->textEdit->append(tr("本地文件:%1创建失败!").arg(serverFileName));
return;
}
ftp->get(fileName, file);
ui->textEdit->append(tr("正在下载:%1......").arg(file->fileName()));
}
//打开文件
void MainWindow::on_pushButton_5_clicked()
{
openSaveFilePath();
}
//选择文件存储路径
bool MainWindow::openSaveFilePath()
{
savePath = QFileDialog::getExistingDirectory(this,tr("选择文件保存路径"),"./");
if(savePath.isEmpty())
{
return false;
}
else
{
ui->lineEdit_4->setText(savePath);
return true;
}
}
void MainWindow::ftpCommandStarted(int)
{
if(ftp->currentCommand() == QFtp::ConnectToHost){
ui->label_6->setText(tr("正在连接到服务器…"));
}
if (ftp->currentCommand() == QFtp::Login){
ui->label_6->setText(tr("正在登录…"));
}
if (ftp->currentCommand() == QFtp::Get){
ui->label_6->setText(tr("正在下载…"));
}
if (ftp->currentCommand() == QFtp::Put){
ui->label_6->setText(tr("正在上传…"));
}
else if (ftp->currentCommand() == QFtp::Close){
ui->label->setText(tr("正在关闭连接…"));
}
}
void MainWindow::ftpStateChanged(int state)
{
if(state == QFtp::Unconnected)
{
ui->textEdit->append(tr("未连接到主机"));
}
if(state == QFtp::Connected)
{
ui->textEdit->append(tr("已经连接到主机"));
}
if(state == QFtp::HostLookup)
{
ui->textEdit->append(tr("正在查找主机"));
}
if(state == QFtp::LoggedIn)
{
ui->textEdit->append(tr("已经登录"));
}
if(state == QFtp::Closing)
{
ui->textEdit->append("连接正在关闭");
}
}
void MainWindow::contextMenuEvent(QContextMenuEvent *event )
{
popMenu = new QMenu(this); //定义一个右键弹出菜单
QAction *refresh=new QAction("刷新",this);
popMenu->addAction(refresh);
connect(refresh,SIGNAL(triggered(bool)),this,SLOT(refreshed()));
QAction *reName=new QAction("重命名",this);
popMenu->addAction(reName);
connect(reName,SIGNAL(triggered(bool)),this,SLOT(fileRename()));
QAction *removeFile=new QAction("删除",this);
popMenu->addAction(removeFile);
connect(removeFile,SIGNAL(triggered(bool)),this,SLOT(deleteFile()));
QAction *createFolder=new QAction("新建文件夹",this);
popMenu->addAction(createFolder);
connect(createFolder,SIGNAL(triggered(bool)),this,SLOT(createNewFolder()));
QAction *cancel=new QAction("concel",this);
popMenu->addAction(cancel);
connect(cancel,SIGNAL(triggered(bool)),this,SLOT(on_cancelBtn_clicked()));
popMenu->move(cursor().pos());
popMenu->show();
//设置菜单风格
popMenu->setStyleSheet("QMenu{background-color: white;}"
"QMenu::item {background-color: transparent;"
"padding:6px 30px;}"
"QMenu::item:selected {background-color: #2dabf9;}");
}
//刷新列表
void MainWindow::refreshed()
{
ui->treeWidget->clear();
ftp->list();
}
//重命名
void MainWindow::fileRename()
{
QString oldName = ui->treeWidget->currentItem()->text(0);
QString str = toSpecialEncoding(oldName);
if(isDirectory.value(str))//选中的是文件夹,则返回
{
QMessageBox::information(this,tr("保存"),tr("<font size='6' color='#008ed5'>文件夹不能重命名!</font>"),QMessageBox::Ok);
return;
}
bool ok;
QString newName = QInputDialog::getText(this, tr("重命名"),
tr("新文件名:"),
QLineEdit::Normal,tr(""),
&ok,Qt::WindowCloseButtonHint);
if(newName.isEmpty())
return;
ftp->rename(toSpecialEncoding(oldName),toSpecialEncoding(newName));
refreshed();
}
//删除文件
void MainWindow::deleteFile()
{
QString deleteFile = ui->treeWidget->currentItem()->text(0);
QString str = toSpecialEncoding(deleteFile);
if(isDirectory.value(str))
{
deleteFolder();
}
QTreeWidgetItem* item = ui->treeWidget->currentItem();
/* if(item->childCount() > 0)//如果有子节点,则删除
{
for(int i = 0; i < item->childCount(); i )
{
deleleNode(item->child(i));
}
}*/
delete item;
/* if(ui->treeWidget->topLevelItemCount()<= 0)
{
ui->cdToParentButton->setEnabled(true);
}*/
ftp->remove(toSpecialEncoding(deleteFile));
}
//进入目录
void MainWindow::processItem(QTreeWidgetItem *item, int column)
{
Q_UNUSED(column)//解决未使用的变量出现警告的问题
QString name = item->text(0);
//转换树列表中的文件名编码,解决点击项目文件夹无反应的问题
QString str = toSpecialEncoding(name);
if (isDirectory.value(str))
{
//如果这个文件是个目录,则打开
ui->treeWidget->clear();
isDirectory.clear();
currentPath = '/';
currentPath = str;
ftp->cd(str);
ftp->list();
// ui->cdToParentButton->setEnabled(true);
}
}
//返回上一级菜单
void MainWindow::on_cdToParentButton_clicked()
{
ui->treeWidget->clear();
isDirectory.clear();
currentPath = currentPath.left(currentPath.lastIndexOf('/'));
if (currentPath.isEmpty())
{
ftp->cd("/");
}
else
{
ftp->cd(currentPath);
}
ftp->list();
}
void MainWindow::on_pushButton_4_clicked()
{
on_cdToParentButton_clicked();
}
//创建文件夹
void MainWindow::createNewFolder()
{
bool ok;
QString folderName = QInputDialog::getText(this, tr("新建文件夹"),
tr("新文件夹名:"),
QLineEdit::Normal,tr(""),
&ok,Qt::WindowCloseButtonHint);
if(folderName.isEmpty())
return;
ftp->mkdir(toSpecialEncoding(folderName));
ui->treeWidget->clear();
ftp->list();
}
void MainWindow::on_setButton_clicked()
{
QMessageBox::about(this,tr("关于"),tr("FTP客户端\n\n"
"--------------声明-----------------\n\n"
"1.本软件仅供学习交流使用\n"
"2.软件名称:FTP客户端\n"
"3.软件版本:1.0\n"
"4.软件作者:OnlyU\n"
"5.邮箱:731482764@qq.com\n\n"
"-------------软件优点--------------\n\n"
"1.实现上传、下载、删除、新建文件夹、重命名、刷新\n"
"2.实现访问服务器的可视化\n"
"3.界面简洁(所有图片资源均为本人用PS软件制作)\n"
"4.实现解决中文乱码问题\n"
"5.实现右键菜单功能\n"
"-------------软件不足--------------\n\n"
"1.由于未经多次测试,可能存在BUG,望使用者与我联系\n"
"2.批量上传下载暂未实现,断点续传也未实现\n"
"3.上传特大会出现卡顿,原因未知\n"
"4.由于时间精力有限,上述不足之处望谅解,待日后有时间予以解决\n\n"));
}
void MainWindow::updateDataTransferProgress(qint64 readBytes, qint64 totalBytes)
{
ui->progressBar->setMaximum(totalBytes/1024); //设置进度条的最大值 除1024目的是防止上传下载大文件时进度条卡顿
ui->progressBar->setValue(readBytes/1024); //设置进度条的当前值
}
//根据相应命令的完成,进行相应操作
void MainWindow::ftpCommandFinished(int, bool error)
{
if(ftp->currentCommand() == QFtp::ConnectToHost)
{
if(error)
{
ui->textEdit->append(tr("连接服务器出现错误:%1").arg(ftp->errorString()));
}
else
ui->label_6->setText(tr("连接到服务器成功"));
}
else if(ftp->currentCommand() == QFtp::Login)
{
if(error)
{
ui->textEdit->append(tr("登录出现错误:%1").arg(ftp->errorString()));
}
else
{
ui->pushButton->setText(tr("注销"));
ui->label_6->setText("connect successful");
ftp->list(); //发射listInfo()信号,显示文件列表
}
}
else if(ftp->currentCommand() == QFtp::Get)
{
if(error)
{
ui->textEdit->append(tr("下载:%1被取消").arg(serverFileName));
file->close();
file->remove();
}
else
{
//在下载命令完成时,使下载按钮为可用,并关闭打开的文件。
ui->label_6->setText(tr("已经完成下载"));
ui->textEdit->append(tr("文件:%1下载完成").arg(serverFileName));
file->close();
}
delete file;
}
else if(ftp->currentCommand() == QFtp::Put)
{
if(error)
{
// ui->textEdit->append(tr("上传:%1被取消").arg(fileName));
file->close();
}
else
{
//然后,在上传命令完成时,使上传按钮可用,并关闭打开的文件。
ui->label_6->setText(tr("已经完成上传"));
ui->textEdit->append(tr("文件:%1上传完成").arg(fileName));
refreshed();
// file->close();
}
// delete file;
}
//处理list命令完成时的情况:
else if(ftp->currentCommand() == QFtp::List)
{
if(isDirectory.isEmpty())
{
//如果目录为空,显示“empty”
ui->treeWidget->addTopLevelItem(new QTreeWidgetItem(QStringList()<< tr("<empty>")));
ui->treeWidget->setEnabled(false);
ui->label_6->setText(tr("该目录为空"));
// ui->cdToParentButton->setEnabled(true);
}
}
else if(ftp->currentCommand() == QFtp::Close)
{
ui->textEdit->append(tr("已经关闭连接"));
ui->label_6->setText(tr("已经关闭连接"));
}
else if(ftp->currentCommand() == QFtp::Rename)
{
ui->textEdit->append(tr("文件重命名成功"));
refreshed();
}
else if(ftp->currentCommand() == QFtp::Mkdir)
{
ui->textEdit->append(tr("新建文件夹成功"));
refreshed();
}
else if(ftp->currentCommand() == QFtp::Remove)
{
ui->textEdit->append(tr("文件删除成功"));
refreshed();
}
else if(ftp->currentCommand() == QFtp::Rmdir)
{
ui->textEdit->append(tr("文件夹删除成功"));
refreshed();
}
}
//删除文件夹
void MainWindow::deleteFolder()
{
QString folder = ui->treeWidget->currentItem()->text(0);
QString str = toSpecialEncoding(folder);
if(isDirectory.value(str))
{
ftp->rmdir(toSpecialEncoding(folder));
}
}
//取消上传和下载
void MainWindow::on_cancelBtn_clicked()
{
ftp->abort();
if(file->exists())
{
file->close();
}
ui->progressBar->setValue(0);
}