本文主要讲解文件操作过程中,查看文件如何实现,实现步骤如下:
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();//产生pduint 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);}}
测试
成功!!!!!!!!!!!!