qt/c++学习笔记之基于tcp的文件同步程序demo(第一部分)

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();
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值