client客户端
头文件
filetrans.h
#ifndef FILETRANS_H
#define FILETRANS_H
#include <QObject>
#include <QTcpSocket>
enum MsgType{
MsgTypeInvaid =0,
MsgTypeFile,
MsgTypeDel,
MsgTypeRename
};
class filetrans : public QObject
{
Q_OBJECT
public:
explicit filetrans(QObject *parent = nullptr);
void sendFile(const QString &filename);
void sendDel(const QString &filename);
void sendRename(const QString &fileold,const QString &filenew);
signals:
public slots:
void onReadReady();
void onConnected();
void onDisconnected();
void onError(QAbstractSocket::SocketError scoketerro);
private:
QTcpSocket tcpsock;
};
#endif // FILETRANS_H
filewatch.h
#ifndef FILEWATCH_H
#define FILEWATCH_H
#include <QWidget>
#include<QFileSystemWatcher>
class filewatch : public QWidget
{
Q_OBJECT
public:
explicit filewatch(QWidget *parent = nullptr);
void setwatchpath(const QString &path);
private slots:
void onDirectoryChanged(const QString &path);
void onFileChange(const QString &path);
signals:
void doFileadd(const QString &file);
void doFileRemove(const QString &file);
void doFileChange(const QString &file);
void doFileRename(const QString &oldname,const QString &newname);
private:
QFileSystemWatcher watch;
QStringList filetest();
QString pathWatch;
QStringList fileold;
};
#endif // FILEWATCH_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QFileSystemWatcher>
#include "filewatch.h"
#include "filetrans.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void onFileadd(const QString &file);
void onFileRemove(const QString &file);
void onFileChange(const QString &file);
void onFileRename(const QString &oldname,const QString &newname);
private:
Ui::Widget *ui;
filewatch watcc;
filetrans filetran;
};
#endif // WIDGET_H
cpp文件
filetrans.cpp
#include "filetrans.h"
#include<QDataStream>
#include<QFile>
filetrans::filetrans(QObject *parent) : QObject(parent)
{
connect(&tcpsock,SIGNAL(readyRead()),this,SLOT(onReadReady()));
connect(&tcpsock,SIGNAL(connected()),this,SLOT(onConnected()));
connect(&tcpsock,SIGNAL(disconnected()),this,SLOT(onDisconnected()));
connect(&tcpsock,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));
tcpsock.connectToHost("127.0.0.1",8888);
}
void filetrans::sendFile(const QString &filename)
{
qDebug()<<"test 断点";
//读取文件
QByteArray datafilecontent;
qDebug()<<"文件名filename"<<filename;
QFile file(filename);
if(!file.open(QIODevice::ReadOnly))
{
qDebug()<<"open file faild";
return;
}
datafilecontent=file.readAll();
file.close();
//封装包头
QByteArray datasen;
QDataStream stream(&datasen,QIODevice::WriteOnly);
stream<<(quint32)0<<MsgTypeFile<<filename<<datafilecontent;
stream.device()->seek(0);
stream<<datasen.size();
tcpsock.write(datasen);
}
void filetrans::sendDel(const QString &filename)
{
//封装包头
QByteArray datasen;
QDataStream stream(&datasen,QIODevice::WriteOnly);
stream<<(quint32)0<<MsgTypeDel<<filename;
stream.device()->seek(0);
stream<<datasen.size();
///
tcpsock.write(datasen);
}
void filetrans::sendRename(const QString &fileold, const QString &filenew)
{
QByteArray datasen;
QDataStream stream(&datasen,QIODevice::WriteOnly);
stream<<(quint32)0<<MsgTypeRename<<fileold<<filenew;
stream.device()->seek(0);
stream<<datasen.size();
tcpsock.write(datasen);
}
void filetrans::onReadReady()
{
}
void filetrans::onConnected()
{
qDebug()<<"conntion";
}
void filetrans::onDisconnected()
{
QObject *obj=this->sender();
QTcpSocket *socket =qobject_cast<QTcpSocket *>(obj);
socket->close();
qDebug()<<"onDisconnected";
}
void filetrans::onError(QAbstractSocket::SocketError scoketerro)
{
qDebug()<<"onError";
}
filewatch.cpp
#include "filewatch.h"
#include<QDebug>
#include<QDir>
filewatch::filewatch(QWidget *parent) : QWidget(parent)
{
connect(&watch,SIGNAL(directoryChanged(QString)),this,SLOT(onDirectoryChanged(QString)));
connect(&watch,SIGNAL(fileChanged(QString)),this,SLOT(onFileChange(QString)));
}
void filewatch::setwatchpath(const QString &path)
{
pathWatch=path;
qDebug()<<"pathWatch"<<path;
QStringList filemuch=this->filetest();
watch.addPaths(filemuch);
watch.addPath(path);
//监听的文件列表
fileold=watch.files();
}
void filewatch::onDirectoryChanged(const QString &path)
{
qDebug()<<"dir change"<<path;
//当前文件列表
QStringList filenow=this->filetest();
//之前的文件列表fileold
if(filenow.count()>fileold.count())
{
//获取新建文件名
foreach(QString ofile,fileold)
{
filenow.removeAll(ofile);
}
watch.addPaths(filenow);
fileold=watch.files();
emit doFileadd(filenow.first());
qDebug()<<"create"<<filenow;
}
}
void filewatch::onFileChange(const QString &path)
{
QStringList fileWatchcc=watch.files();
//监听列表里面还包含path,传进来的文件,说明文件还在,只是发生了改变
if(fileWatchcc.contains(path))
{
emit doFileChange(path);
qDebug()<<"file change";
}else
{
QStringList fileNow=this->filetest();
if(fileNow.count()==fileold.count())
{
foreach(QString wfile,fileold){
fileNow.removeAll(wfile);
}
watch.addPaths(fileNow);
emit doFileRename(path,fileNow.first());
qDebug()<<"rename old"<<path<< " new name "<<fileNow;
}
else {//删除
emit doFileRemove(path);
qDebug()<<"file delete "<<path;
}
}
fileold=watch.files();
}
QStringList filewatch::filetest()
{
QDir dir(pathWatch);
QFileInfoList infoList = dir.entryInfoList(QDir::Files);
QStringList ret;
foreach(QFileInfo info,infoList)
{
ret.append(info.absoluteFilePath());
}
return ret;
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include<QFileInfo>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
connect(&filebb,SIGNAL(doFile(QString,QByteArray)),this,SLOT(onFile(QString,QByteArray)));
connect(&filebb,SIGNAL(doDel(QString)),this,SLOT(onDel(QString)));
connect(&filebb,SIGNAL(doRename(QString,QString)),this,SLOT(onRename(QString,QString)));
fileServerpath="C:/Users/f/Desktop/server";
}
Widget::~Widget()
{
delete ui;
}
void Widget::onFile(const QString &filename, const QByteArray &data)
{
qDebug()<<"file"<<filename;
//filename是客户端的路径
QFileInfo fileinfoo(filename);
QString fileNameJust =fileinfoo.fileName();
QString fileNameLocal =fileServerpath +"/"+fileNameJust;
QFile file(fileNameLocal);
if(!file.open(QIODevice::WriteOnly))
{
qDebug()<<"open faild";
}
file.write(data);
file.close();
}
void Widget::onDel(const QString &filename)
{
qDebug()<<"del"<<filename;
QFileInfo fileinfoo(filename);
QString fileNameJust =fileinfoo.fileName();
QString fileNameLocal =fileServerpath +"/"+fileNameJust;
QFile::remove(fileNameLocal);
}
void Widget::onRename(const QString &fileold, const QString &filenew)
{
qDebug()<<"rename"<<fileold<<"new name"<<filenew;
QFileInfo fileinfoold(fileold);
QString fileNameJustold =fileinfoold.fileName();
QString fileNameLocalold =fileServerpath +"/"+fileNameJustold;
QFileInfo fileinfonew(filenew);
QString fileNameJustnew=fileinfonew.fileName();
QString fileNameLocalnew =fileServerpath +"/"+fileNameJustnew;
QFile::rename(fileNameLocalold,fileNameLocalnew);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}