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