网盘——查看文件

本文主要讲解文件操作过程中,查看文件如何实现,实现步骤如下:

1、实现步骤:

A、首先客户端发送查看请求(包含目录信息)

B、服务器将文件名字还有文件的类型发送给客户端(只发送文件的名字)

C、客户端接收回复信息后,在文件列表里面显示

2、代码实现

在jack文件夹下提前放置以下文件,图片和文本文件

2.1、刷新文件夹槽函数

    void flushDir();
void Book::flushDir()
{
    QString strCurPath = TcpClient::getinstance().curPath();
    PDU *pdu =mkPDU(strCurPath.size()+1);
    pdu->uiMsgType=ENUM_MSG_TYPE_FLUSH_FRIEND_REQUEST;
    strncpy((char*)(pdu->caMsg),strCurPath.toStdString().c_str(),strCurPath.size());
    //发送给服务器
    TcpClient::getinstance().getTcpSocket().write((char*)pdu,pdu->uiPDULen);
    free(pdu);
    pdu=NULL;
}

2.2、关联刷新文件夹信号槽

    connect(m_pFlushFilePB,SIGNAL(clicked(bool)),this,SLOT(flushDir()));

2.3、添加刷新文件夹协议

    ENUM_MSG_TYPE_FLUSH_DIR_REQUEST,  //刷新文件夹请求
    ENUM_MSG_TYPE_FLUSH_DIR_RESPOND,  //刷新文件夹回复

2.4、服务器端创建刷新文件夹的请求

得到文件夹下的文件情况

case ENUM_MSG_TYPE_FLUSH_DIR_REQUEST:
    {
        qDebug()<<"cbdh";
        char *pCurPath = new char[pdu->uiMsgLen];
        memcpy(pCurPath,pdu->caMsg,pdu->uiMsgLen);
        //遍历目录,获得文件信息
        QDir dir(pCurPath);
        QFileInfoList fileInfoList = dir.entryInfoList();
        for(int i=0;i<fileInfoList.size();i++)
        {

            qDebug()<<fileInfoList[i].fileName()
                   <<fileInfoList[i].size()
                  <<"文件夹:"<<fileInfoList[i].isDir()
                 <<"常规文件:"<<fileInfoList[i].isFile();
        }
        break;
    }

2.5、定义一个结构体,将信息存起来

struct FileInfo
{
    char caFileName[32];//文件名字
    int  iFileType;//文件类型

};

2.6、拷贝文件

    case ENUM_MSG_TYPE_FLUSH_DIR_REQUEST:
    {
        qDebug()<<"cbdh";
        char *pCurPath = new char[pdu->uiMsgLen];
        memcpy(pCurPath,pdu->caMsg,pdu->uiMsgLen);
        //遍历目录,获得文件信息
        QDir dir(pCurPath);
        QFileInfoList fileInfoList = dir.entryInfoList();

        //产生pdu
        int iFileCount = fileInfoList.size();
        PDU *respdu = mkPDU(sizeof (FileInfo)*iFileCount);
        respdu->uiMsgType = ENUM_MSG_TYPE_FLUSH_DIR_RESPOND;
        FileInfo *pFileInfo =NULL;
        QString strFileName;
        for(int i=0;i<iFileCount;i++)
        {
            //拷贝进去,跳到下一个结构体
            pFileInfo = (FileInfo*)(respdu->caMsg)+i;
            strFileName = fileInfoList[i].fileName();
            
            memcpy(pFileInfo->caFileName,strFileName.toStdString().c_str(),strFileName.size());
            //判断类型
            if(fileInfoList[i].isDir())
            {
                pFileInfo->iFileType=0;//表示是个文件夹
            }
            else if(fileInfoList[i].isFile()) {
                pFileInfo->iFileType =1;//常规文件
            }
        }
        //发送
        write((char*)respdu, respdu->uiPDULen);
        free(respdu);
        respdu =NULL;
        break;
    }

2.7、在客户端的Widget添加Book

    Book *getBook();
Book *OpeWidget::getBook()
{
    return m_pBook;
}

2.8、添加更新文件夹的函数

  //更新文件列表
    void updateFileList(const PDU *pdu);

2.9、在客户端添加回复的case

   case ENUM_MSG_TYPE_FLUSH_DIR_RESPOND:
    {
        OpeWidget::getInstance().getBook()->updateFileList(pdu);
        break;
    }

2.10、更新文件夹的函数

void Book::updateFileList(const PDU *pdu)
{
    if(NULL==pdu)
    {
        return;
    }
    FileInfo *pFileInfo =NULL;
    int iCount = pdu->uiMsgLen/sizeof (FileInfo);
    for(int i=0 ;i<iCount;i++)
    {
        pFileInfo =(FileInfo*)(pdu->caMsg)+i;
        qDebug()<<pFileInfo->caFileName<<pFileInfo->iFileType;
        QListWidgetItem *pItem = new QListWidgetItem;
        if(0==pFileInfo->iFileType)
        {
             pItem->setIcon(QIcon(QPixmap(":/map/dir.jpg")));
        }
        else if(1==pFileInfo->iFileType) {
            pItem->setIcon(QIcon(QPixmap(":/map/reg.png")));
        }
        pItem->setText(pFileInfo->caFileName);
        m_pBookListW->addItem(pItem);
    }

}

测试

成功!!!!!!!!!!!!

  • 15
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值