void RecevieFile::recevie_file() { QDataStream in(receive); in.setVersion(DATA_STREAM_VERSION); /* 首部未接收/未接收完 */ if(gotBytes <= 2 * sizeof(qint64)) { if(!nameSize) // 前两个长度字段未接收 { if(receive->bytesAvailable() >= 2 * sizeof(qint64)) { in >> fileBytes >> nameSize; gotBytes += 2 * sizeof(qint64); ui->recvProg->setMaximum(fileBytes); ui->recvProg->setValue(gotBytes); } else // 数据不足,等下次 return; } else if(receive->bytesAvailable() >= nameSize) { in >> fileName; gotBytes += nameSize; ui->recvProg->setValue(gotBytes); std::cout << "--- File Name: " << fileName.toStdString() << std::endl; } else // 数据不足文件名长度,等下次 return; } /* 已读文件名、文件未打开 -> 尝试打开文件 */ if(!fileName.isEmpty() && file == Q_NULLPTR) { file = new QFile(fileName); if(!file->open(QFile::WriteOnly)) // 打开失败 { std::cerr << "*** File Open Failed ***" << std::endl; delete file; file = Q_NULLPTR; return; } ui->stLabel->setText(QString("Open %1 Successfully!").arg(fileName)); } if(file == Q_NULLPTR) // 文件未打开,不能进行后续操作 return; if(gotBytes < fileBytes) // 文件未接收完 { gotBytes += receive->bytesAvailable(); ui->recvProg->setValue(gotBytes); file->write(receive->readAll()); } if(gotBytes == fileBytes) // 文件接收完 { receive->close(); // 关socket file->close(); // 关文件 delete file; ui->stLabel->setText(QString("Finish receiving %1").arg(fileName)); ui->listenBtn->setEnabled(true); } }
时间: 2024-02-15 10:27:54 浏览: 73
pre-receive:一个简单的gitlab commit消息检查钩子
这是一个文件接收的函数,用于从网络上接收文件并保存到本地。函数的具体实现如下:
1. 创建一个QDataStream对象in,用于从网络套接字receive中读取数据。设置数据流版本为DATA_STREAM_VERSION。
2. 判断接收到的数据是否足够读取。如果接收到的字节数小于等于两个qint64类型的长度字段,则说明还没有接收到文件名和文件大小信息。此时需要根据接收到的数据长度逐步解析出文件名和文件大小,更新接收进度条的最大值和当前值。
3. 如果接收到的字节数大于两个qint64类型的长度字段,则说明已经接收到了文件名,需要将其读取出来。更新接收进度条的当前值,并输出文件名到控制台。
4. 如果文件名不为空且文件指针file为空,则说明还未打开文件,需要尝试打开文件。如果文件打开失败,则输出错误信息并返回。
5. 如果文件指针file不为空,则说明文件已经打开成功,可以开始接收文件内容。将接收到的数据写入文件中,同时更新接收进度条的当前值。
6. 判断是否已经接收完整个文件。如果接收的字节数等于文件大小,则说明已经接收完整个文件。此时需要关闭网络套接字receive和文件指针file,同时删除文件指针file。更新状态标签的文本内容,并启用监听按钮。
总体来说,该函数的作用是逐步解析接收到的数据,保存到本地文件中,并更新接收进度条的当前值和状态标签的文本内容。如果接收到的数据不足以解析出完整的文件信息或者文件打开失败,则需要等待下一次接收。
阅读全文